4

コンストラクターが別の関数を呼び出すクラスがある場合、それが呼び出されたことと正しい回数を確認するにはどうすればよいですか?

class MyClass
  def initialize(count)
    count.times{self.do_something}
  end

  def do_something
    # whatever
  end

end

みたいなこと言いたい

n = 4
MyClass.new(n).should_receive(:do_something).exactly(n).times
n = 2
MyClass.new(n).should_receive(:do_something).exactly(n).times

しかし、do_something の呼び出しが should_receive がアタッチされる前に発生するため、これは失敗します (少なくとも、それが理由だと思います)。

expected: 4 times with any arguments
received: 0 times with any arguments

それとも、コンストラクターからこのようなものを呼び出すのは間違っているので、リファクタリングする必要がありますか?

また、この質問は次の質問と非常によく似ています。

rspec:コンストラクターによって呼び出されるインスタンスメソッドをスタブする方法は?

しかし、過去 5 年間で、スタブ化された呼び出しを手動で実装するよりも、答えが改善されたことを願っていnewます。

4

4 に答える 4

7

これを行うための新しい構文は次のとおりです。

allow_any_instance_of(ExampleClass).to receive(:example_method).and_return("Example")
expect_any_instance_of(ExampleClass).to receive(:example_method).and_return("Example")

ドキュメントを見る

于 2014-10-22T16:14:02.023 に答える