44

引数でデリゲートを取得するクラスを取得しました。このクラスはそのデリゲートを呼び出します。Moq で単体テストを行いたいと考えています。このメソッドが呼び出されたことを確認するにはどうすればよいですか?

例のクラス:

public delegate void Foo(int number);

public class A
{
   int a = 5;

   public A(Foo myFoo)
   {
      myFoo(a);
   }
}

Foo が呼び出されたことを確認したい。ありがとうございました。

4

5 に答える 5

65

このコミットの時点で、 Moq はデリゲートのモックをサポートするようになりました。あなたの状況では、次のようにします。

var fooMock = new Mock<Foo>();
var a = new A(fooMock.Object);

次に、デリゲートが呼び出されたことを確認できます。

fooMock.Verify(f => f(5), Times.Once);

または:

fooMock.Verify(f => f(It.IsAny<int>()), Times.Once);
于 2014-09-11T18:54:39.940 に答える
37

匿名関数の使用についてはどうですか? ここではインライン モックのように機能します。モック フレームワークは必要ありません。

bool isDelegateCalled = false;
var a = new A(a => { isDelegateCalled = true});

//do something
Assert.True(isDelegateCalled);
于 2012-06-12T14:41:33.893 に答える
4

Moq はデリゲートのモックをサポートしていません。ただし、デリゲート署名に一致するメソッドを使用して、いくつかのインターフェイスを作成できます。

public interface IBar
{
    void M(int number);
}

次に、このインターフェイスを実装するモックを作成し、このモック オブジェクトを使用してデリゲートを作成します。

Mock<IBar> bar = new Mock<IBar>();
Foo foo = new Foo(bar.Object.M); 
A a = new A(foo);
bar.Verify(x => x.M(5));   

sut を実行した後、モックされたオブジェクトに対する期待を検証できるようになります。

更新: 実際には、デリゲート インスタンスを作成bar.Object.Mせずに、単に sut に渡すことができます。Fooとにかく、デリゲートをモックするにはインターフェイスを作成する必要があります。

于 2012-06-12T14:19:54.293 に答える
4

あなたはそのようなことをすることができます:

 public interface IWithFOOMethod
 {
     void FooAlikeMethod(int number);
 }

 Mock<IWithFOOMethod> myMock = new Mock<IWithFOOMethod>();

 A a = new A(myMock.Object.FooAlikeMethod);

 myMock.Verify(call => call.Foo(It.IsAny<int>()), Times.Once())
于 2012-06-12T14:20:55.410 に答える
1

Moq はデリゲートのモックをサポートしていないため、通常は次のように処理します。

var list = new List<int> ();
var del = i => list.Add (i);
var a = new A(del);
list.ShouldContainOnly (new[] { 5 });

提供されたデリゲートは、単純で検証可能なアクションを実行します。

于 2012-06-12T14:37:21.900 に答える