9

IInterface.SomeMethod<T>(T arg)のモックがを使用して呼び出されたことを確認できませんMoq.Mock.Verify

It.IsAny<IGenericInterface>()またはを使用してメソッドが「標準」インターフェースで呼び出されたことを確認できます。を使用しIt.IsAny<ConcreteImplementationOfIGenericInterface>()てジェネリックメソッド呼び出しを確認するのに問題はありませんが、を使用してIt.IsAny<ConcreteImplementationOfIGenericInterface>()ジェネリックメソッドが呼び出されたことを確認できません。It.IsAny<IGenericInterface>()が呼び出されず、単体テストが失敗します。

これが私のユニットテストです:

public void TestMethod1()
{
    var mockInterface = new Mock<IServiceInterface>();

    var classUnderTest = new ClassUnderTest(mockInterface.Object);

    classUnderTest.Run();

    // next three lines are fine and pass the unit tests
    mockInterface.Verify(serviceInterface => serviceInterface.NotGenericMethod(It.IsAny<ConcreteSpecificCommand>()), Times.Once());
    mockInterface.Verify(serviceInterface => serviceInterface.NotGenericMethod(It.IsAny<ISpecificCommand>()), Times.Once());
    mockInterface.Verify(serviceInterface => serviceInterface.GenericMethod(It.IsAny<ConcreteSpecificCommand>()), Times.Once());

    // this line breaks: "Expected invocation on the mock once, but was 0 times"
    mockInterface.Verify(serviceInterface => serviceInterface.GenericMethod(It.IsAny<ISpecificCommand>()), Times.Once());
}

これが私のテスト中のクラスです:

public class ClassUnderTest
{
    private IServiceInterface _service;

    public ClassUnderTest(IServiceInterface service)
    {
        _service = service;
    }

    public void Run()
    {
        var command = new ConcreteSpecificCommand();
        _service.GenericMethod(command);
        _service.NotGenericMethod(command);
    }
}

これが私のIServiceInterface

public interface IServiceInterface
{
    void NotGenericMethod(ISpecificCommand command);
    void GenericMethod<T>(T command);
}

そして、これが私のインターフェース/クラス継承階層です:

public interface ISpecificCommand
{
}

public class ConcreteSpecificCommand : ISpecificCommand
{
}
4

2 に答える 2

6

これは、現在のリリースバージョンであるMoq4.0.10827の既知の問題です。GitHubhttps://github.com/Moq/moq4/pull/25でこのディスカッションを参照してください。私はそのdevブランチをダウンロードし、コンパイルして参照しました。これでテストに合格しました。

于 2013-02-28T03:09:01.670 に答える
2

私はそれを翼にするつもりです。T引数を指定する必要があるためGenericMethod<T>、次のことを実行できますか。

mockInterface.Verify(serviceInterface => serviceInterface.GenericMethod(It.Is<object>(x=> typeof(ISpecificCommand).IsAssignableFrom(x.GetType()))), Times.Once());
于 2013-02-28T01:18:57.997 に答える