我正在寫一個簡單的測試用例,測試我的控制器在調用我的服務之前調用緩存。我正在使用xUnit和Moq來完成任務。正確的方式測試ASP.NET核心IMemoryCache
我正面臨一個問題,因爲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',因爲它是一個庫的一部分。圖書館的作者應該做測試。 –