Überprüfung der generischen Methode mit Moq

Ich habe Probleme, diesen Schein zu überprüfenIInterface.SomeMethod<T>(T arg) wurde mit angerufenMoq.Mock.Verify.

Ich kann überprüfen, ob die Methode über eine "Standard" -Schnittstelle aufgerufen wurdeIt.IsAny<IGenericInterface>() oderIt.IsAny<ConcreteImplementationOfIGenericInterface>(), und ich habe keine Probleme beim Überprüfen eines generischen Methodenaufrufs mitIt.IsAny<ConcreteImplementationOfIGenericInterface>()Ich kann jedoch nicht überprüfen, ob eine generische Methode mit aufgerufen wurdeIt.IsAny<IGenericInterface>() - Es wird immer angegeben, dass die Methode nicht aufgerufen wurde und der Komponententest fehlschlägt.

Hier ist mein Unit Test:

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());
}

Hier ist meine Klasse im Test:

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);
    }
}

Hier ist meinIServiceInterface:

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

Und hier ist meine Schnittstellen- / Klassenvererbungshierarchie:

public interface ISpecificCommand
{
}

public class ConcreteSpecificCommand : ISpecificCommand
{
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage