Проблема с настройкой соответствия в Moq - PullRequest
2 голосов
/ 13 декабря 2010

Я использую 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 Ответ

1 голос
/ 15 декабря 2010

Одной из возможных причин является то, что в какой-то момент перед вызовом этого конкретного метода тестирования 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();
}

НТН

...