2014-01-20 3 views
7
require './spec/spec_helper' 
require './bank' 

describe Bank do 
    context "#transfer" do 
    before(:all) do 
     @customer1 = Customer.new(500) 
     customer2 = Customer.new(0) 
     @customer1.stub(:my_money).and_return(1000) 
     customer2.stub(:my_money).and_return(0) 
     @transfer_message = Bank.new.transfer(@customer1, customer2, 2000) 
    end 

    it "should return insufficient balance if transferred amount is greater than balance" do 
     expect(@transfer_message).to eq("Insufficient funds") 
    end 

    it "calls my_money" do 
     expect(@customer1).to have_received(:my_money) 
    end 
    end 
end 

Wenn ich before(:each) statt before(:all) verwenden funktioniert es. Aber wenn before(:all) verwenden, wird Fehler wie undefined method proxy_for for nil:NilClass ausgelöst. Ich konnte den Grund nicht herausfinden. Kannst du mir bitte Helfen? Danke im Voraus.Methode Anstoßen auf vor (: all)

+0

Wie ich mich erinnere "vor (: alle)" ist beraubt und ersetzt durch "vor zu tun ..." ist auch richtiger Weg ist nicht Variablen verwenden, könnten Sie stattdessen "Let" verwenden. Wenn Sie nil: NilClass haben, bedeutet dies, dass rspec keinen Kundendatensatz in der Datenbank erstellt hat (es könnte ein Resolver sein, indem er 'let! (: Object) {action}') aufruft. – itsnikolay

Antwort

7

before(:all) ist nicht veraltet, aber die Verwendung von Doubletten aus rspec-mocks in before(:all) wird nicht unterstützt. Siehe die referenzierten Ausgaben in github issue für Hintergrund.

Die aktuelle Version von master rspec-Mocks, mit 3.0.0.beta2 zur Verfügung steht, wird mit dem folgenden Fehler fehlschlagen:

The use of doubles or partial doubles from rspec-mocks outside of the per-test lifecycle is not supported. 

Frühere Versionen werden die undefined method proxy_for ... Fehler an dem Punkt der Anstoßen erzeugen.

+0

Aus Neugier könnten Sie mir sagen, warum sie diese vorherige rspec3 nicht unterstützt haben? –

+0

Sehen Sie sich die Links in der GitHub-Ausgabe an und Sie erhalten Hintergrundinformationen. –

5

sollte diese Arbeit:

require "rspec/mocks/standalone" 
before(:all) do 
+0

Vorsicht. Dies führte dazu, dass mir mehr Fehler bei der Wiederholung meiner Testfälle auftraten: "SQLite3 :: ConstraintException: UNIQUE constraint". Vielleicht wäre es nett, eine Erklärung hinzuzufügen, was "Standalone" ist. Ich habe es gelöst, indem ich einen 'Debugger' am Anfang meiner Testdatei gesetzt habe, alle Modelldatensätze gelöscht habe, als es 'Model.destroy_all' ausgelöst hat, und auch sql_sequence mit' Base.connection.execute' gelöscht habe. –

5

spät zur Party? Ja, aber würde nichts dagegen haben meinen eigenen Cent von dem was ich entdeckt habe fallen zu lassen. Ich habe einen ähnlichen Fehler beim Versuch gefunden, eine Anfrage in einem RSpec.configure Block zu stubben, so dass der Stub nur für Beispiele verfügbar ist, die ich die Option config.around(:each, option) übergebe.

Also, das heißt, ich habe den Stub außerhalb des Bereichs der einzelnen Beispiele, die nicht von RSpec::Mockshere unterstützt wird! Eine Umgehung ist die Verwendung eines temporären Bereichs im Kontext. So

Sie haben

before(:all) do 
    RSpec::Mocks.with_temporary_scope do 
    @customer1 = Customer.new(500) 
    customer2 = Customer.new(0) 
    @customer1.stub(:my_money).and_return(1000) 
    customer2.stub(:my_money).and_return(0) 
    @transfer_message = Bank.new.transfer(@customer1, customer2, 2000) 
    end 
end 

HTH!

+0

Dies ist erstaunlich und sollte wahrscheinlich im Kern IMO, z.B. "Wenn Sie eine Untergruppe von markierten Beispielen verwenden, sollte dies in Ordnung sein und in einem temporären Umfang ausgeführt werden". – adarsh