0

下面是主项目的 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 '
4

1 回答 1

0

您必须实际向控制器发出请求(get,postput),以便模拟可以检查任何内容。

例如:

it "should find PayrollItem and return object" do
  PayrollItem.should_receive(:find).with("0").and_return(@payroll_item)
  put :update, :id => "0"
end

除此之外,查看您的代码,您的返回值存在一些不一致:在您的块中,您使用 idbefore存根来返回某些东西,然后在您的第一个规范中,您使用 id 来模拟它返回相同的东西。PayrollItem.find10

存根和模拟相同的方法很好,因为它们实现不同的功能:存根确保代码顺利运行,而模拟实际上检查期望。但是,您应该为相同的参数存根/模拟它,以便使用此before块的所有规范都在测试相同的东西。

于 2012-09-28T07:16:51.923 回答