2016-08-09 18 views
1

Wenn in meinem RSpec Test IWie bekomme ich eine Abfrage, um mein Mock-Objekt zurückzugeben?

foo = mock_model(Foo, id: 1) 

& meinen Code haben läuft

Foo.where(id: 1) 

Mein Code wird immer fehlschlagen, da die mock_modelfoo nie an die Foo Sammlung gehören wird, z.B.

Foo.count # => 0 

Wenn ich laufen foo.instance_of?(Foo) ich true so das Verhalten richtig ist. Was vermisse ich? Ich würde mich gerne auf echte Mocks verlassen. & müssen sich nicht auf FactoryGirl verlassen oder ein Objekt von Foo selbst instantiieren.

Antwort

1

Erstens, gut gemacht, wenn Sie FactoryGirl nicht verwenden. Ihre Tests werden schneller, da Sie die Häufigkeit verringern, mit der Ihre Tests auf Ihre Datenbank treffen. Aber dieser Ansatz wird Ausdauer erfordern.

Nun, sobald Sie Mock_Model verwenden, müssen Sie alle Methoden, die auf Ihrem Mock aufgerufen werden stub.

Dies bedeutet, dass Sie Foo.where (id: 1) nicht aufrufen können, da dies ein Modellobjekt ist, das Ihr neu erstelltes foo nicht enthält. Remember foo ist ein verspottetes Objekt, das nicht in deine Datenbank geschrieben wird.

Also die 'Anomalie', die Sie erhalten, ist keine Anomalie. Es sagt dir, dass dein verspottetes Objekt foo, eine Form Foo hat, was es natürlich tut. Aber dein Schein wird nicht in der Datenbank gespeichert. Foo.count kehrt daher 0.

Um Ihren Test zu beenden Sie benötigen, um Ihre Behauptung zu beenden, indem etwas in dieser Richtung sagen

allow(Foo).to receive(where).with(id: 1).and_return(foo)

ich diese

hilft hoffen
Verwandte Themen