0

私は次のテストを行っています:

  describe "Exporter#get_method" do
    before(:each) do
      exporter.should_receive(:get_method).at_least(:once).and_call_original
    end

    it "should get the next terminal value" do
      exporter.send(:get_method).should == :split
    end

    it "should call descend if the current value is a hash" do
      exporter.should_receive(:descend).once

      2.times { exporter.send(:get_method) }
    end

    it "should call ascend if at the end of an array and there is a prologue" do
      exporter.should_receive(:ascend).once

      3.times { exporter.send(:get_method) }
    end
  end

いくつかのbinding.pry呼び出しで、昇順と降順が呼び出されていることを確認できます。ただし、RSpecはそれを認識していません。私はどこが間違っているのですか。テストされているメソッドが正しい状況で他のメソッドを呼び出すことを確認したいと思います。これを行う別の方法はありますか?

4

1 に答える 1

0

before私は決して期待をブロックに入れない傾向があります。私の見方では、beforeブロックは実際にはテストしている状況を設定するためのものであり、期待を裏切るためのものではありません。exporter.should_receive(:get_method).at_least(:once).and_call_originalブロックから移動しbeforeて3つのブロックに分散するとどうなりますかit(3つのケースのそれぞれで必要に応じて編集します)。should_receive他の呼び出しと競合している可能性があります。

また、exporter.get_methodの代わりに、を呼び出した場合は機能しますexporter.send(:get_method)か?一般に、RSpecは実装ではなく動作をテストすることを目的としてget_methodおり、プライベートメソッドの場合、直接テストする意味はありません。代わりに、そのプライベートメソッドを使用するメソッドのテストを作成することをお勧めします。それ以外の場合、それがプライベートメソッドでない場合、なぜ使用しているの:sendですか?

于 2013-01-06T23:11:14.720 に答える