Я пишу простой тестовый пример, который проверяет, что мой контроллер вызывает кеш перед вызовом моего сервиса. Я использую xUnit и Moq для выполнения этой задачи.Правильный способ тестирования ASP.NET Core 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', так как он является частью библиотеки. Авторы библиотеки должны провести тестирование. –