0

プレゼンターがいます:

class MyPresenter < Decorator    
  . . .

  def items
    . . .
  end

  # a method being tested which uses the above method
  def saved_items
    items.reject { |m| m.new_record? }
  end
end

とそのテスト:

describe MyPresenter do
  . . .

  describe "#saved_items" do
    subject { MyPresenter.new(container) }

    it "doesn't include unsaved items" do
      # I want to stub items method:
      subject.should_receive(:items).and_return([])
      subject.saved_items.should == []
    end
  end
end

何らかの理由で、このテストは次のエラーで失敗します。

  1) MyPresenter#saved_items doesn't include unsaved items
     Failure/Error: subject.saved_items.should == []
       Double received unexpected message :items with (no args)
     # ./app/presenters/my_presenter.rb:35:in `items'
     # ./app/presenters/my_presenter.rb:42:in `saved_items'
     # ./spec/presenters/my_presenter_spec.rb:78:in `block (3 levels) in <top (required)>'

なぜ失敗するのですか?itemsスタブしたのにメソッドを呼び出すのはなぜですか?

4

2 に答える 2

0

subjectブロックを使用しないでください。

 it "doesn't include unsaved items" do
   my_presenter = MyPresenter.new(container)
   my_presenter.should_receive(:items).and_return([])
   my_presenter.saved_items.should == []
 end

beforeテストで重複が見つかった場合は、ブロック内のオブジェクトのインスタンス化を抽出できます。多くの場合subject、非常に便利ですが、使用しないことでより単純なテストが得られる場合があります。

于 2012-12-06T18:18:25.483 に答える
0

実際、私は同じ問題を抱えていて、このように修正しました:

それ以外の:

subject.should_receive

置いた:

MyPresenter.any_instance.should_receive
于 2012-12-06T16:22:51.577 に答える