1

BaseClass.my_method への呼び出しを省略しながら ChildClass のインスタンスが something_interesting を呼び出すことをテストしたいと思います

class BaseClass
  def my_method *args, &block
  end
end

class ChildClass < BaseClass
  def my_method first_arg, second_arg
    something_interesting
    super first_arg, second_arg
  end
end

次のようにテストを書くと:

subject = ChildClass.new
subject.should_receive :something_interesting
BaseClass.any_instance.stub :my_method
subject.my_method

エラーが発生します:

ArgumentError: 引数の数が間違っています (2 に対して 3)

なぜそうなるのですか?それを正しくスタブする方法は?

4

3 に答える 3

3

私はこれで少し遊んでいなければなりませんでした。これはばかげているかもしれませんが、(スタブなしで)それを行うためのかなり明示的な方法だと思います:

require 'rspec'

class BaseClass
  def my_method *args, &block
    raise 'hell'
  end
end

class ChildClass < BaseClass
  def my_method first_arg, second_arg
    something_interesting
    super first_arg, second_arg
  end

  def something_interesting
  end
end


describe ChildClass do
    it "should work" do
        class BaseClass
            def my_method *args, &block
            end
        end
        subject = ChildClass.new
        subject.should_receive :something_interesting
        subject.my_method 'two', 'args'
    end
end

モンキーパッチは少し邪悪かもしれませんが、テストするときに持っている素晴らしいツールです。

于 2012-07-16T17:07:09.797 に答える
1

まず第一に、インスタンスとの間に関係はありません。インスタンスでメソッドをスタブBaseClass.any_instanceChildClass.new、別のインスタンスでスタブを期待しているだけです。

第二に、テストはオブジェクトの内部部分をテストすることを意図したものではありません。オブジェクトを扱っている場合はBaseClass'、そのメソッドをテストしてください。オブジェクトを扱っている場合はChildClass'、このオブジェクトが思い付く可能性のあるすべてのものを確認してください。内部に深く入り込まないでください。

于 2012-07-16T09:43:36.890 に答える
-1

あなたはスタブすることができますsuper

describe ChildClass do
  it 'calls something_interesting' do
    subject.should_receive(:something_interesting)
    subject.stub(:super)
    subject.my_method 'a', 'b'
  end
end
于 2012-07-16T18:21:42.857 に答える