Moq - простой тест кэша - PullRequest
       11

Moq - простой тест кэша

0 голосов
/ 08 июня 2011

Я только начинаю с Moq и модульного тестирования в целом.Я пытаюсь создать простой тест, чтобы убедиться, что моя функция кэширования работает правильно.

Почему следующий тест не пройден?Тест не пройден, потому что хранилище вызывается дважды.Однако я прошел через отладчик и убедился, что второй вызов извлекает данные из кэша и не запрашивает репозиторий.

[TestMethod]
public void Test_Cache()
    {
var Service = new Service(_mockRepository.Object, _mockLogger.Object, _mockCacheStorage.Object);

Service.GetAll();
Service.GetAll();

_mockRepository.Verify(r => r.FindAll(), Times.Once());
}

Обновление

Вотпроверенный мною сервисный код работает через отладчик.

public IList<Csa> GetAll()
    {
        try
        {
            string cacheKey = "GetAll";

            IList<Csa> activeList = _cacheStorage.Get<List<Csa>>(cacheKey);

            if (activeList == null)
            {
                activeList = _Repository.FindAll();
                _cacheStorage.Set(cacheKey, activeList);
            }

            return activeList;
        }
        catch (Exception exception)
        {
            _logger.Log(LogType.Error, exception.ToString());
            throw;
        }
    }

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Я думаю, вам нужно разбить тестирование на два отдельных теста.Один тест должен проверить, что хранилище доступно, когда activeList имеет значение null, а другой тест должен убедиться, что выборка из хранилища пропущена, когда activeList не равен null.Ключ в том, чтобы «заглушить» вызов _cacheStorage.Get <> в пропущенной версии.

Примерно так:

[TestMethod]
public void Test_Cache()
{
    var Service = new Service(_mockRepository.Object, _mockLogger.Object, _mockCacheStorage.Object);

    _mockCacheStorage.SetupGet(g => g.Get<List<Csa>>(It.IsAny<string>).Returns(new List<Csa>());

    Service.GetAll();

    _mockRepository.Verify(r => r.FindAll(), Times.Never());
}
1 голос
/ 08 июня 2011

Похоже, у вас проблема с тем, что ваше фиктивное хранилище всегда возвращает ноль. Вы издеваетесь над кеш-хранилищем, поэтому я предполагаю, что вызовы Get и Set в вашем кешированном хранилище не сохраняются из списка должным образом. У вас есть несколько вариантов:

  • mock get и установите в вашем хранилище mock cache для получения и установки локальной переменной или диктонары
  • создайте реализацию-заглушку интерфейса вашего кеш-хранилища, который просто использует словарь под
  • не вводите зависимость для вашего кеша, а просто используйте словарь в вашей реализации.
...