6

私は次のクラスを持っています:

public class HelperClass  
{  
    HandleFunction<T>(Func<T> func)
    {
         // Custom logic here

         func.Invoke();

         // Custom logic here  
}

// The class i want to test  
public class MainClass
{
    public readonly HelperClass _helper;

    // Ctor
    MainClass(HelperClass helper)
    {
          _helper = helper;
    }

    public void Foo()
    {
         // Use the handle method
         _helper.HandleFunction(() =>
        {
             // Foo logic here:
             Action1();
             Action2(); //etc..
        }
    }
}

私はテストしたいMainClassだけです。私は RhinoMocks を使用HelperClassしてテストでモックを作成しています。
問題は、HandleFunction()メソッドのテストには興味がないのですが、チェックに興味がAction1あるメソッドと、呼び出されたときAction2に送信された他のアクションです。メソッドをモックし、その内部ロジックを回避しながら、送信されたコードを呼び出すには どうすればよいですか?パラメータとして?HandleFunction()
HandleFunction()

4

2 に答える 2

6

テスト中のユニットは、続行する前にデリゲートを呼び出す必要がある可能性が高いため、モックから呼び出す必要があります。ヘルパー クラスの実際の実装とモック実装の呼び出しにはまだ違いがあります。モックには、この「カスタム ロジック」は含まれません。(それが必要な場合は、嘲笑しないでください!)

IHelperClass helperMock = MockRepository.GenerateMock<IHelperClass>();
helperMock
  .Stub(x => x.HandleFunction<int>())
  .WhenCalled(call => 
  { 
    var handler = (Func<int>)call.Argument[0];
    handler.Invoke();
  });

// create unit under test, inject mock

unitUnderTest.Foo();
于 2013-01-28T10:29:50.400 に答える
4

ステファンの答えに加えて、渡された引数を呼び出すスタブを定義する別の方法を示したいと思います。

handler
    .Stub(h => h.HandleFunction(Arg<Func<int>>.Is.Anything))
    .Do((Action<Func<int>>)(func => func()));

Do()ハンドラーの詳細については、こちらこちらをお読みください。

于 2013-01-28T17:04:29.500 に答える