payroll_items_controller_spec.rb:18:在Rspec控制器代码中显示的`block(2级)

时间:2012-09-28 07:09:04

标签: ruby rspec controllers

以下是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 '

1 个答案:

答案 0 :(得分:0)

您必须向控制器实际发出请求(getpostput等),以便模拟有任何要检查的内容。

例如:

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块的所有规范都在测试相同的内容。