Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从集成测试中播种时,.NET Core 3.1 IMemoryCache为空_C#_Unit Testing_Asp.net Core_.net Core_Memorycache - Fatal编程技术网

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));
这将直接在工厂范围内设置缓存,现在将使用它