【问题标题】:payroll_items_controller_spec.rb:18:in `block (2 levels) displayed in Rspec Controller codepayroll_items_controller_spec.rb:18:in `block (2 level) 显示在 Rspec 控制器代码中
【发布时间】:2012-09-28 07:09:04
【问题描述】:

以下是主条目的 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 '

【问题讨论】:

    标签: ruby rspec controllers


    【解决方案1】:

    您必须实际向控制器发出请求(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 块中,您使用 id 为 1 存根 PayrollItem.find 以返回某些内容,然后在您的第一个规范,你用 0 的 id 模拟它以返回相同的东西。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2020-11-10
      相关资源
      最近更新 更多