2013-05-15 4 views
5

私はモジュールを持っている:混在クラスメソッドをテストするには、RSpecとMochaを呼び出していますか?

次のようにクラスで使用される
module MyModule 
    def do_something 
    # ... 
    end 
end 

class MyCommand 
    extend MyModule 

    def self.execute 
    # ... 
    do_something 
    end 
end 

にはどうすればMyCommand.executedo_somethingを呼び出していることを確認していますか?私はモカと部分的モックを試してみましたが、do_somethingが呼び出されていない場合、それは失敗しません:

it "calls do_something" do 
    MyCommand.stubs(:do_something) 
    MyCommand.execute 
end 

答えて

5

まあ、それは一つです溶液。

私はthis SO postで述べたように、モック/スタブへの2つの戦略があります

テストの終わりにモカの expectsが自動的にアサートを使用して

1)。あなたのケースでは、expectsの後にMyCommand.executeが呼び出されない場合、テストは失敗します。

2)これを行うためのより具体的な/主張する方法は、スタブとスパイの組み合わせを使用することです。スタブは、あなたが指定した振る舞いを持つ擬似オブジェクトを作成します。そしてスパイはそのメソッドを呼び出すかどうかを調べます。 (これはRSpecのあることに注意)あなたの例を使用するには:

require 'mocha' 
require 'bourne' 

it 'calls :do_something when .execute is run' do 
    AnotherClass.stubs(:do_something) 

    MyCommand.execute 

    expect(AnotherClass).to have_received(:do_something) 
end 

# my_command.rb 
class MyCommand 
    def self.execute 
    AnotherClass.do_something 
    end 
end 

だから expectラインをチェックして、 :do_somethingがMyCommand `で呼び出されたかどうかを確認するために bourneのマッチャーを使用しています。

4

[OK]を、expectsがソリューションであるように見えます:

it "calls do_something" do 
    MyCommand.expects(:do_something) 
    MyCommand.execute 
end 
+0

ちょうどこの同じ質問があったので、この答えでクラスメソッドが呼び出されることを期待することができます – haiqus

関連する問題