Проблема с настройкой соответствия в Moq

Я использовал Moq на прошлой неделе или около того и не было никаких проблем до сегодняшнего дня. У меня проблема с получением VerifyAll() чтобы правильно соответствовать настройке моего макета.

В настоящее время я пишу модульные тесты для API моего приложения. Вот как структурировано приложение:

API <==> Service <==> DAO <==> Database

Имея это в виду, я высмеиваю объект службы, а затем создаю объект API с помощью смоделированной службы. Я написал ряд тестов уже без проблем до сих пор.

У меня есть две переменные экземпляра, как это:

private Api _api;
private Mock<IHibernateService> mockService;

Я инициализирую их в методе настройки:

[SetUp]
public void DoSetupTasks()
{
    mockService = new Mock<IHibernateService>();
    _api = new Api(mockService.Object);
}

Вот модульный тест, который не проходит:

    [Test]
    public void TestSearchOnAllProperties()
    {
        mockService
            .Setup(service => service.LoadAll(It.IsAny<Type>()))
            .Returns(new DomainBase[0]);

        var dmbs = _api.SearchOnAllProperties("search term", typeof(DomainBase));

        mockService.VerifyAll();
    }

API SearchOnAllProperties() впоследствии метод сделает звонок в сервис LoadAll() метод (с некоторой дополнительной логикой, конечно), поэтому я хочу убедиться, что он вызывается правильно. Чтобы уточнить, вот как LoadAll() вызывается в SearchOnAllProperties():

public IEnumerable<DomainBase> SearchOnAllProperties(string searchTerm, Type type)
{
    foreach (DomainBase dmb in _hibernateService.LoadAll(type))
    {
        // additional logic
    }
}

Тем не менее, когда я запускаю модульный тест, я получаю MockVerificationException заявив, что данная настройка не была сопоставлена. Я не могу понять, почему, как это должно быть, звонит в службу LoadAll() метод.

1 ответ

Решение

Одной из возможных причин является то, что в какой-то момент перед вызовом этого конкретного метода тестирования, mockService присваивается новый экземпляр Mock<IHibernateService>, Если это так, то этот метод теста будет вызывать Setup на неправильном экземпляре, который затем произвел бы это исключение.

Быстрый способ проверить это будет использовать местный mockService а также api Переменные и посмотреть, если тест все еще не проходит:

[Test]
public void TestSearchOnAllProperties()
{
    var localMockService = new Mock<IHibernateService>();
    var localApi = new Api(localMockService.Object);

    localMockService
        .Setup(service => service.LoadAll(It.IsAny<Type>()))
        .Returns(new DomainBase[0]);

    var dmbs = localApi.SearchOnAllProperties("search term", typeof(DomainBase));

    localMockService.VerifyAll();
}

НТН

Другие вопросы по тегам