Вопрос по c#, verify, moq – Проверка универсального метода, вызванного с помощью Moq

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

Ваш Ответ

2   ответа
6

которая является текущей версией выпуска. Смотрите это обсуждение на GitHubhttps://github.com/Moq/moq4/pull/25, Я скачал его ветку dev, скомпилировал и сослался на нее, и теперь ваш тест пройден.

С тех пор это было исправлено. arni
0

Я собираюсь это сделать. посколькуGenericMethod<T> требует предоставления аргумента T, возможно ли это сделать:

mockInterface.Verify(serviceInterface => serviceInterface.GenericMethod(It.Is<object>(x=> typeof(ISpecificCommand).IsAssignableFrom(x.GetType()))), Times.Once());
Спасибо за вклад, но это, похоже, тоже не работает. sennett

Похожие вопросы