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

それに加えて、コードを見ると、戻り値にいくつかの矛盾があります。beforeブロックでは、何かを返すPayrollItem.findために id でスタブしており、最初の仕様では、 to1の id でそれをモックしています。0同じものを返す。

同じメソッドをスタブとモックの両方で実行しても問題ありません。これらは異なる機能を実行するためです。スタブはコードがスムーズに実行されることを確認し、モックは実際に期待値をチェックします。beforeただし、このブロックを使用するすべての仕様が同じことをテストするように、同じ引数に対してスタブ化/モック化する必要があります。

于 2012-09-28T07:16:51.923 に答える