【问题标题】: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)

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多