Moq - 简单缓存测试

时间:2011-06-07 23:41:52

标签: c# unit-testing mocking moq

我刚开始使用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 个答案:

答案 0 :(得分:3)

我认为您需要将测试分解为两个单独的测试。一个测试应验证当activeList为null时访问存储库,另一个测试应验证当activeList不为null时跳过存储库中的提取。关键是“存根”_cacheStorage.Get&lt;&gt;打电话给跳过的版本。

这样的事情:

[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 :(得分:1)

您的模拟缓存存储似乎总是返回null。您正在模拟缓存存储,因此我的猜测是在缓存存储上调用Get和Set不会正确地保存在列表中。您有几个选择:

  • 模拟获取并设置模拟缓存存储以获取并设置局部变量或dictonary
  • 创建缓存存储接口的存根实现,只使用
  • 下的字典
  • 不要为缓存存储注入依赖项,只需在实现中使用字典。