2016-08-30 7 views
2

Ich möchte testen, ob eine Klasse eine Klasse-Methodenaufruf in RSpec erhält:Wie bewirken Sie, dass die Ausführung in RSpec angehalten wird?

describe MyObject do 
    it "should create a new user" do 
    expect(User).to receive(:new) 
    MyObject.new.doit 
    end 
end 

class MyObject 
    def doit 
    u = User.new 
    u.save 
    end 
end 

Das Problem ist, dass die Erwartung die Ausführung nicht stoppen. Es stubpt einfach die Klassenmethode und setzt die Ausführung fort.

Der Effekt der Erwartung ist sicherzustellen, dass User.new zurückgibt. Wenn wir also zur nächsten Zeile kommen, die User.save ist, schlägt es fehl, weil kein Benutzerobjekt .save aufgerufen werden kann.

Ich möchte, dass die Ausführung stoppt, sobald die RSpec-Erwartung erfüllt wurde - wie kann ich das tun?

nb

Dies ist nur ein illustratives Beispiel - während ein expect to change würde für User.new arbeitet, ist es nicht der eigentliche Code, den ich

Antwort

1

Es ist eine großartige Methode für diese and_call_original:

expect(User).to receive(:new).and_call_original 
+0

Sie Schönheit Zishe - das ist perfekt –

+0

Ich hoffe, es funktioniert, habe ich nicht versucht – zishe

+1

Ich habe nur getan, und es funktioniert einwandfrei - ty –

0

auf der Grundlage Ihrer Testbeschreibung testen muß, Sie‘ re Prüfung, dass ein Datensatz wurde in diesen Fällen erstellt, würde ich Ihnen vorschlagen, dies zu tun:

expect { 
    MyObject.new.doit 
}.to change{User.count} 

oder wenn Sie sicherstellen möchten, dass es erstellt nur eine:

expect { 
    MyObject.new.doit 
}.to change{User.count}.by(1)  
+0

Das Beispiel wählte ich war nur ein Beispiel. Ich stimme dem zu, was Sie sagen, wenn ich überprüfen wollte, ob ein Benutzer erstellt wurde, aber ich möchte tatsächlich eine andere Methode testen, die nicht mit dieser Technik getestet werden kann. Ich muss wirklich testen, dass eine Klassenmethode heißt –

Verwandte Themen