1

特定のメソッドが呼び出されたことを表明したいのですが、メソッドをモック/スタブしたくありません。そのコードもテストに含めたいと思います。

たとえば、Rubyでは次のようになります。

def bar()
  #stuff I want to test
end

def foo()
  if condition
    bar()
  end

  #more stuff I want to test
end

# The test:

foo()
assert_called :bar

誰かが提案(またはそれについて行くためのより良い方法)を持っていますか?私の実際のコードはかなり複雑なので、例の単純さを考慮に入れないでください。

4

2 に答える 2

0

これは、2つのテストケースを作成するための非常に良い方法です。1つは呼び出して呼び出されたfoo()かどうbar()かを確認し、もう1つはそれがうまくいくかどうかを確認bar()します。テストするときはfoo()、何を返す必要があるかを知っておく必要がありますbar()

于 2012-02-17T20:54:23.113 に答える
0

おそらく次のようなものです:

require 'set'

class Class
  def instrument
    self.instance_methods.each do |m|
      old = method(m)
      define_method(m) do |*a,&b|
        @__called__ ||= Set.new
        @__called__ << m
        old.bind(self).call(*a,&b)
      end
    end
  end
end

class Object
  def assert_called(method)
    if not (@__called__ && @__called__.include?(method))
      # You will have to figure out how to make this equivalent to a failing
      #   assertion for your favorite test framework
      raise "Assertion failed! #{method} has not been called"
    end
  end
end

次に、クラスを定義した後、テストを実行する前に:

FooClass.instrument

このコードはまだテストしていないことに注意してください。

于 2012-02-17T21:15:17.693 に答える