以下是rspec中主控项的控制器代码。
坦率地说,我对Ruby非常陌生,对编码有一点了解。
require 'spec_helper'
describe PayrollItemsController , "with valid params" do
before(:each) do
@payroll_item = mock_model(PayrollItem, :update_attributes => true)
PayrollItem.stub!(:find).with("1").and_return(@payroll_item)
end
it "should find PayrollItem and return object" do
PayrollItem.should_receive(:find).with("0").and_return(@payroll_item)
end
it "should update the PayrollItem object's attributes" do
@payroll_item.should_receive(:update_attributes).and_return(true)
end
end
当我运行控制器代码时,显示以下错误:
(Mock "PayrollItem_1001").update_attributes(any args)
expected: 1 time
received: 0 times
./payroll_items_controller_spec.rb:18:in `block (2 levels) in '
答案 0 :(得分:0)
您必须向控制器实际发出请求(get
,post
,put
等),以便模拟有任何要检查的内容。
例如:
it "should find PayrollItem and return object" do
PayrollItem.should_receive(:find).with("0").and_return(@payroll_item)
put :update, :id => "0"
end
除此之外,查看您的代码时,您的返回值存在一些不一致:在before
块中,您将PayrollItem.find
存入ID 1
以返回一些东西,然后在你的第一个规范中你用id 0
来嘲笑它以返回相同的东西。
对于存根和模拟相同的方法都很好,因为它们可以实现不同的功能:存根确保代码顺利运行,而模拟实际检查期望。但是,您应该使用相同的参数对其进行存根/模拟,以便使用此before
块的所有规范都在测试相同的内容。