[英]Asp.Net Core: reset memoryCache for Integration Tests
我創建了一些基本的集成測試來調用我的 Api 並查看權限是否正常工作。 現在我遇到了一個問題,其中運行更多的所有測試,其中一個失敗 - 如果單獨運行,它不會。
原因是,一旦用戶登錄,我就使用 IMemoryCache 來存儲某些權限。但是對於我的集成測試,權限存儲在緩存中,當我嘗試為測試更改它們時,它們不會刷新。
一般來說,有沒有辦法使每個集成測試的 MemoryCache 無效?
我的集成測試類之一基本上是這樣做的:
public IntegrationTest(CustomWebApplicationFactory<Namespace.Startup> factory)
{
_factory = factory;
_client = _factory.CreateClient();
// init the DB here etc...
var response = await _client.GetAsync("api/Some/Path");
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
有沒有辦法告訴工廠不要使用緩存或使用模擬緩存或類似的東西?
編輯:
緩存在我的 startup.cs 中設置如下:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
[...]
}
}
這是通過 DependenyInjection 注入到我的控制器中,如下所示:
private IMemoryCache _cache;
private MemoryCacheEntryOptions _cacheOptions;
const int CACHE_LIFETIME_IN_DAYS = 7;
public SomeController(IMemoryCache cache) {
_cache = cache;
_cacheOptions = new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromDays(CACHE_LIFETIME_IN_DAYS));
}
我在我的控制器中使用_cache.TryGetValue
和_cache.Set
作為快速修復,您可以嘗試執行以下操作:
var memoryCache = _factory.Services.GetService<IMemoryCache>() as MemoryCache;
memoryCache.Compact(1.0);
當您需要重置緩存時。
但我建議要么考慮在測試之間不共享_factory
(盡管它可能會產生一些性能影響)或覆蓋(就像在帶有上下文的文檔中所做的那樣) IMemoryCache
到您可以根據需要在外部控制的東西。
UPD
由於默認情況下測試不是並行運行的,因此您可以手動注冊MemoryCache
實例。 像這樣的東西:
public class CustomWebApplicationFactory<TStartup>
: WebApplicationFactory<TStartup> where TStartup : class
{
internal readonly MemoryCache MemoryCache;
public CustomWebApplicationFactory()
{
MemoryCache = new MemoryCache(new MemoryCacheOptions());
}
public void ClearCache() => MemoryCache.Compact(1.0);
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
var descriptor = services.SingleOrDefault(
d => d.ServiceType ==
typeof(IMemoryCache));
services.Remove(descriptor);
services.AddSingleton<IMemoryCache>(MemoryCache);
});
}
}
並在測試調用factory.ClearCache()
:
public void Test1()
{
var factory = new CustomWebApplicationFactory<Startup>();
var memoryCache = factory.Services.GetService<IMemoryCache>() as MemoryCache;
memoryCache.Set("test", "test");
factory.ClearCache();
Assert.IsFalse(memoryCache.TryGetValue("test", out var val));
}
如果您需要使用相同的工廠並行運行測試(盡管我會說最好只創建不同的工廠),那么您可以創建IMemoryCache
實現,它將以某種方式確定(例如在客戶端請求中傳遞某些特定標頭)不同的測試運行並返回不同的MemoryCache
實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.