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