我刚开始使用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;
}
}
答案 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不会正确地保存在列表中。您有几个选择: