【问题标题】:How to get a query to return my mock object?如何获取查询以返回我的模拟对象?
【发布时间】:2016-08-09 12:55:51
【问题描述】:
如果在我的 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 本身的对象。
【问题讨论】:
标签:
ruby-on-rails
unit-testing
rspec
mocking
stubbing
【解决方案1】:
首先,不使用 FactoryGirl 做得很好。随着您减少测试访问数据库的次数,您的测试将变得更快。但这种方法需要坚持不懈。
现在,一旦您使用了 mock_model,您将需要存根在您的 mock 上调用的所有方法。
这意味着您将无法调用 Foo.where(id: 1),因为这是一个不包含您新创建的 foo 的模型对象。请记住 foo 是一个模拟对象,它不会写入您的数据库。
所以你得到的“异常”不是异常。它告诉你你的模拟对象 foo 有一个 Foo 形式,它当然有。但是您的模拟未保存到数据库中。因此 Foo.count 返回 0。
要完成您的测试,您需要通过以下几句话来完成您的断言
allow(Foo).to receive(where).with(id: 1).and_return(foo)
希望对你有帮助