如果在我的RSpec测试中
foo = mock_model(Foo, id: 1)
和我的代码运行
Foo.where(id: 1)
我的代码将始终失败,因为
mock_model
foo
永远不会属于Foo集合,例如Foo.count # => 0
如果我运行
foo.instance_of?(Foo)
,我会得到true
,因此行为正确。我想念什么?我想依靠真实的模拟,而不必依靠FactoryGirl或实例化Foo本身的对象。
最佳答案
首先,在不使用FactoryGirl的情况下做得很好。随着您减少测试命中数据库的次数,您的测试将变得更快。但是这种方法将需要坚持不懈。
现在,一旦使用了模拟模型,您将需要对模拟中调用的所有方法进行 stub 。
这意味着您将无法调用Foo.where(id:1),因为这是一个不包含新创建的foo的模型对象。记住foo是一个模拟对象,不会写入数据库。
因此,您遇到的“异常”不是异常。它告诉您,模拟对象foo的格式为Foo,当然可以。但是您的模拟并未保存到数据库中。因此Foo.count返回0。
要完成测试,您需要通过说几句来结束您的断言allow(Foo).to receive(where).with(id: 1).and_return(foo)
我希望这有帮助
关于ruby-on-rails - 如何获取查询以返回我的模拟对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38851387/