2016-08-09 48 views
1

如果我的RSpec的测试我有如何获取查询以返回我的模拟对象?

foo = mock_model(Foo, id: 1) 

&我的代码运行

Foo.where(id: 1) 

我的代码将永远无法为mock_modelfoo永远不会属于富收藏,例如

Foo.count # => 0 

如果我跑foo.instance_of?(Foo)我得到true这样的行为是正确的。我错过了什么?我想依靠真正的模拟&不必依赖FactoryGirl或实例化Foo本身的对象。

回答

1

首先,没有使用FactoryGirl做得很好。您的测试将变得更快,因为您正在减少测试到达数据库的次数。但这种做法需要毅力。

现在,一旦你使用mock_model,你将需要存储你的模拟器上调用的所有方法。

这意味着您将无法调用Foo.where(id:1),因为这是不包含新创建的foo的模型对象。记住foo是一个模拟对象,它不会写入您的数据库。

所以你得到的'异常'不是一个异常。它告诉你,你的嘲弄对象foo,有一个形式Foo,当然它是。但是你的模拟不会保存到数据库中。因此Foo.count返回0

要完成你的测试,你需要说沿着这些线路

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

我希望这有助于

东西干掉你的断言
相关问题