この記事の質問( Funcをmoqする方法 )を採用し、答えが正しくないのでそれを採用しました。
_public class FooBar
{
private Func<IFooBarProxy> __fooBarProxyFactory;
public FooBar(Func<IFooBarProxy> fooBarProxyFactory)
{
_fooBarProxyFactory = fooBarProxyFactory;
}
public void Process()
{
_fooBarProxyFactory();
_fooBarProxyFactory();
}
}
_
コンストラクターパラメーターとして渡されるFunc <>をモックする必要があります。funcが2回呼び出されたことをアサートします。
関数をモックしようとすると、Func型がモック可能ではないため、var funcMock = new Mock<Func<IFooBarProxy>>();
Moqが発生し、例外が発生します。
問題は、funcをモックしないと、funcが(n)回呼び出されたことを確認できないことです。 funcMock.Verify( (), Times.AtLeast(2));
Funcのモックを使用する必要はないと思います。
IFooBarProxy
のモックを返す通常のFuncを自分で作成するだけです。
int numberOfCalls = 0;
Func<IFooBarProxy> func = () => { ++numberOfCalls;
return new Mock<IFooBarProxy>(); };
var sut = new FooBar(func);
sut.Process();
Assert.Equal(2, numberOfCalls);
少なくともMoq 4.5.28以降では、Funcをモックして検証できるはずです。この機能がいつ追加されたかはわかりませんでした(元の質問によると、これは機能しませんでした)。
[Test]
public void TestFoobar()
{
var funcMock = new Mock<Func<IFooBarProxy>>();
var fooBar = new FooBar(funcMock.Object);
fooBar.Process();
funcMock.Verify(x => x(), Times.AtLeast(2));
}
Moq以降 v4.1.1308.212
この質問が尋ねられてから数か月後にリリースされたこのバージョン(2013年8月21日)では、_Func<>
_ が追加されました をモックする機能。したがって、現在のバージョンのモックでは、var funcMock = new Mock<Func<IFooBarProxy>>();
を使用できます。
元の(古い)回答
Func
、Actions
などのコールバックがたくさんある場合は、テストでヘルパーインターフェイスを定義し、そのインターフェイスをモックすることをお勧めします。このようにして、戻り値の設定、入力引数のテストなど、通常のMoq機能を使用できます。
_interface IFooBarTestMethods
{
IFooBarProxy FooBarProxyFactory();
}
_
用途
_var testMethodsMock = new Mock<IFooBarTestMethods>();
testMethodsMock
.Setup(x => x.FooBarProxyFactory())
.Returns(new Mock<IFooBarProxy>());
var sut = new FooBar(testMethodsMock.Object.FooBarProxyFactory);
testMethodsMock.Verify(x => x.FooBarProxyFactory(), Times.Exactly(2));
_