【发布时间】:2017-04-02 17:59:15
【问题描述】:
我正在编写一个简单的测试用例,测试我的控制器在调用我的服务之前调用缓存。我正在使用 xUnit 和 Moq 来完成这项任务。
我遇到了一个问题,因为GetOrCreateAsync<T> 是一种扩展方法,框架无法模拟这些方法。我依靠内部细节发现我可以模拟 TryGetValue 并逃脱我的测试(请参阅 https://github.com/aspnet/Caching/blob/c432e5827e4505c05ac7ad8ef1e3bc6bf784520b/src/Microsoft.Extensions.Caching.Abstractions/MemoryCacheExtensions.cs#L116)
[Theory, AutoDataMoq]
public async Task GivenPopulatedCacheDoesntCallService(
Mock<IMemoryCache> cache,
SearchRequestViewModel input,
MyViewModel expected)
{
object expectedOut = expected;
cache
.Setup(s => s.TryGetValue(input.Serialized(), out expectedOut))
.Returns(true);
var sut = new MyController(cache.Object, Mock.Of<ISearchService>());
var actual = await sut.Search(input);
Assert.Same(expected, actual);
}
我无法入睡,因为我正在查看 MemoryCache 的实现细节,而且它随时可能发生变化。
作为参考,这是 SUT 代码:
public async Task<MyViewModel> Search(SearchRequestViewModel request)
{
return await cache.GetOrCreateAsync(request.Serialized(), (e) => search.FindAsync(request));
}
您会建议进行不同的测试吗?
【问题讨论】:
-
你不应该测试
IMemoryCache,因为它是库的一部分。图书馆的作者应该进行测试。
标签: c# asp.net-core moq extension-methods .net-core