【问题标题】:Asking rspec to stub find(1), instead it's encountering find(1, {:conditions=>nil})要求 rspec 存根 find(1),而不是遇到 find(1, {:conditions=>nil})
【发布时间】:2011-07-02 22:44:09
【问题描述】:

我告诉 rspec:

@foo1 = Factory(:foo)
@foo2 = Factory(:foo)
Foo.stub(:find).with(@foo1.id){@foo1}
Foo.stub(:find).with(@foo2.id){@foo2}

作为此代码的规范:

f = Foo.find(foo_id)

我得到这个错误:

预期:(1) 得到: (1, {:conditions=>nil})

我想也许无法告诉存根需要什么参数,我只能使用should_receive,即使这不是我在本规范中测试的行为——但我试过了,它有同样的错误。

【问题讨论】:

  • 您的期望在哪里(与 .should 一致)?
  • 没有期望,只有存根——我现在更改了标题以反映这一点。
  • F.stub!(:find).with(@f.id).and_return(@f) ??
  • 你能给我们看完整的例子吗?目前尚不清楚您的期望是什么。
  • 感谢您的想法/意见——我意识到我的问题出在代码的其他地方。

标签: ruby-on-rails ruby activerecord rspec


【解决方案1】:

我认为你遗漏了一些东西。存根只返回一个预设响应,因此您实际上不必从数据库中检索数据。你仍然需要对自己的代码有一个期望。

#In some spec...
@foo = mock(Foo)
Foo.stub!(:find).and_return(@foo)
#...do stuff that calls Foo.find...
x.should be_y

当然,您总是可以使用fixtures 来为您的测试数据库播种,那么您根本不必模拟ActiveRecord...

【讨论】:

  • 你让我意识到我没有提到我的规范,那就是我想对find 的两个不同调用存根——也许 rspec 不能这样做,我应该只是改用should_receive(尽管这不是我实际测试的行为,这就是为什么我想改用stub
  • 实际上我尝试了should_receive 并得到了同样的错误——我的问题已经充实了一点。让我知道你的想法。
  • 感谢您的想法/意见——我意识到我的问题出在代码的其他地方。
  • 虽然严格来说,使用夹具(或工厂,或任何实际使用数据库的东西)使其成为集成测试而不是单元测试。
猜你喜欢
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 2013-01-02
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2016-03-05
相关资源
最近更新 更多