rspec在这两种情况下通过 - 有什么区别吗?

时间:2014-04-03 12:36:38

标签: ruby-on-rails ruby rspec

我在rspec中运行了两个测试,它们似乎都让我的代码通过了。它们之间有什么区别吗?

我不希望第二个例子通过我的测试,因为它不会留下任何东西。

示例1

Lead.stub(:find_or_initialize_by).and_return(lead)
expect(lead).to receive(:find_or_initialize_by).with(contact_id: contact_id, presentation_id: presentation_id) 

示例2

expect(Lead).to receive(:find_or_initialize_by).with(contact_id: contact_id, presentation_id: presentation_id).and_return(lead)

1 个答案:

答案 0 :(得分:0)

您的测试必须使用您列出的参数调用find_or_initialize_by方法的代码,这就是您的两个测试都将通过的原因。

当您存根方法时,这意味着ActiveRecord的find_or_initialize_by方法实际上不会被调用。它不会对数据库执行SQL查询来查找记录,如果不存在记录,它也不会在数据库中创建记录。

如果您想让第一次测试失败,您可以说

expect(Lead.where(contact_id: contact_id, presentation_id: presentation_id)).to exist

那会失败,因为find_or_initialize_by在第一个例子中是存根的,所以它的效果(创建记录)实际上并没有发生,那么当你去寻找记录它实际上并不存在所以测试失败

这可能不是一个有价值的测试,我建议你写一本关于使用rspec进行测试的书,这样你就可以深入了解哪些类型的场景对测试很有价值