我在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)
答案 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进行测试的书,这样你就可以深入了解哪些类型的场景对测试很有价值