Ü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
{
}