2016-09-01 2 views
2

Ich habe ein ActiveRecord-Objekt Benutzer. In der App, die ich mache, benutze ich ein Single-Sign-on-Gem, aber ich muss einige der Benutzerdaten in unserer Datenbank speichern. Mein Application hat diesen Code:Wie man den Erstellungsanruf für ein neues ActiveRecord-Objekt in RSpec mockt?

def create_user 
    User.create(name: current_user['name'], email: current_user['email'], company_id: current_user['id']) 
end 

Ich brauche einen RSpec Test, der die tatsächliche create Anruf verspottet werden. Ich habe versucht

allow_any_instance_of(User).to receive(:create).with(any_args).and_return(user) 

, die einen Fehler zurückgibt, der sagt "Benutzer implementiert nicht create".

Antwort

2

jvillian ist richtig, dass das Problem ist, dass create von User implementiert wird, nicht von einer Instanz User. direkt auf User (dh verwenden allow anstelle von allow_any_instance_of) Die einfache Lösung ist nur die Methode Stummel:

allow(User).to receive(:create).with(any_args).and_return(user) 

Auch .with(any_args) ist eine no-op, so ist dies äquivalent:

allow(User).to receive(:create).and_return(user) 
+0

Diese Lösung gearbeitet, danke Jungs! –

+0

Gute Eins! Danke, dass du ein paar Schritte weiter gegangen bist als ich ... – jvillian

2

Ich denke, dass allow_any_instance_of erwartet eine Instanz von Usercreate zu implementieren. create ist jedoch eine Klasse Methode. Also, ich glaube, die Fehlermeldungen sagen, dass InstanzenUser nicht implementieren create.

Ich würde vorschlagen, wenn class_double für Ihren Anwendungsfall funktioniert. Schauen Sie sich Rspec Mocks und this SO Post von Myron Marston.

Verwandte Themen