簡體   English   中英

Asp.Net Core:為集成測試重置 memoryCache

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM