2012-02-17 4 views
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 

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

答えて

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 

注意!

+0

ダニエル、私は実証しているアイデアを現実にするためにRubyメタプログラミングに精通していますか? –

+0

私はそれの要点を取得する - それは私がおそらく私が実際にテストメソッドのために、より明示的にそれを行うだろう :-)確かにRubyのアプローチです: 古い=メソッド(:FOO) define_method(:FOO) を行います... end ありがとうございます! –

+0

それを聞いてうれしがってうれしかった!敬具 –

0

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

関連する問題