web-dev-qa-db-ja.com

Moqを使用してFunc <>コンストラクターパラメーターをモックし、2回呼び出されたことを確認する

この記事の質問( 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));

27

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);
33
Daniel Hilgarth

少なくとも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));
}
22
ktam33

Moq以降 v4.1.1308.212

この質問が尋ねられてから数か月後にリリースされたこのバージョン(2013年8月21日)では、_Func<>_ が追加されました をモックする機能。したがって、現在のバージョンのモックでは、var funcMock = new Mock<Func<IFooBarProxy>>();を使用できます。

元の(古い)回答

FuncActionsなどのコールバックがたくさんある場合は、テストでヘルパーインターフェイスを定義し、そのインターフェイスをモックすることをお勧めします。このようにして、戻り値の設定、入力引数のテストなど、通常の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));
_
4
huysentruitw