Ich schreibe einen einfachen Testfall, der testet, dass mein Controller den Cache aufruft, bevor er meinen Dienst aufruft. Ich verwende xUnit und Moq für die Aufgabe.Korrekte Art, ASP.NET Core zu testen IMemoryCache
Ich habe ein Problem, weil GetOrCreateAsync<T>
eine Erweiterungsmethode ist, und diese können nicht durch das Framework verspottet werden. Ich verließ sich auf interne Details, um herauszufinden, ich TryGetValue
statt und weg mit meinem Test verspotten kann (siehe 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);
}
Ich kann nicht mit der Tatsache, schlafen, dass ich in die Memoryimplementierungsdetails bin spähen und es kann sich jederzeit ändern.
Als Referenz ist dies der SUT-Code:
public async Task<MyViewModel> Search(SearchRequestViewModel request)
{
return await cache.GetOrCreateAsync(request.Serialized(), (e) => search.FindAsync(request));
}
Würden Sie anders Testen empfehlen?
Sie sollten nicht testen 'IMemoryCache' da es Teil einer Bibliothek ist. Die Autoren der Bibliothek sollten die Tests durchführen. –