C# 从集成测试中播种时,.NET Core 3.1 IMemoryCache为空
问题是关于使用C# 从集成测试中播种时,.NET Core 3.1 IMemoryCache为空,c#,unit-testing,asp.net-core,.net-core,memorycache,C#,Unit Testing,Asp.net Core,.net Core,Memorycache,问题是关于使用实体框架核心3.1和IMemoryCache的Web API,因为搜索复杂。示例存储库: 公共类用户存储库:IUserRepository { 专用只读IMemoryCache\u缓存; 私有只读应用程序dbContext_dbContext; 公共用户存储库(IMemoryCache缓存、ApplicationDbContext dbContext) { _缓存=缓存; _dbContext=dbContext; } 公共异步任务GetAll() { 列表用户=_cache.Ge
实体框架核心3.1
和IMemoryCache
的Web API,因为搜索复杂。示例存储库:
公共类用户存储库:IUserRepository
{
专用只读IMemoryCache\u缓存;
私有只读应用程序dbContext_dbContext;
公共用户存储库(IMemoryCache缓存、ApplicationDbContext dbContext)
{
_缓存=缓存;
_dbContext=dbContext;
}
公共异步任务GetAll()
{
列表用户=_cache.Get(“用户”);
如果(用户!=null)
{
返回UserMapper.MapToCacheModelList(用户);
}
return wait_dbContext.Users.toListSync();
}
公共异步任务插入(用户)
{
//添加到数据库
_dbContext.Users.Add(用户);
wait_dbContext.saveChangesSync();
//添加到缓存
List cachedUsers=_cache.Get(“用户”);
Add(UserMapper.MapToCacheModel(user));
}
}
这是一个非常简单的示例,但它让您清楚地知道如何使用它。要进行复杂的测试,测试项目中有一个定制的web应用程序工厂,它使用Startup.cs
配置webhost、DI和所有东西。显然,DbContext
已从DI中删除,并切换到具有EF Core 3.1
的内存DB
问题是我想在这个定制的web应用程序工厂中为应用程序内的内存缓存
种子。它工作正常,但是当测试试图插入用户时,它失败了,因为
List cachedUsers=_cache.Get(“用户”)代码>此行将为空。web应用程序工厂中的MemoryCache
种子似乎与DI中的UserRepository
中解析的实例不同
但是,如果我从工厂范围手动解析IMemoryCache
,我可以在启动时看到种子数据DbContext
的种子设定正确,除此之外一切正常
更新:
集成测试通过Microsoft.AspNetCore.Mvc运行。通过创建WebApplicationFactory
的自定义实现来测试命名空间。这将创建一个web应用程序,就像您调试自己的API
时一样,因此当您调用ActionMethod
并请求保存用户时,IMemoryCache
是新创建的web应用的应用内缓存,就像docker容器一样,与您从集成测试代码解析的缓存不同
至少我现在是这么想的
您知道在应用程序中获取缓存的最佳方法是什么吗?而不只是为了测试目的而在应用程序中创建假控制器?请考虑在创建WebApplicationFactory后设置缓存,如下所示:
var factory = new MyWebApplicationFactory<Startup>();
var queriesClient = factory.CreateClient();
using var scope = factory.Services.CreateScope();
var memCache = scope.ServiceProvider.GetRequiredService<IMemoryCache>();
memCache.Set("Key", Value);
using HttpResponseMessage response = await queriesClient.GetAsync(new Uri(requestUri));
var factory=new MyWebApplicationFactory();
var querysclient=factory.CreateClient();
使用var scope=factory.Services.CreateScope();
var memCache=scope.ServiceProvider.GetRequiredService();
memCache.Set(“键”,值);
使用HttpResponseMessage response=wait queriesClient.GetAsync(新Uri(requestUri));
这将直接在工厂范围内设置缓存,现在将使用它