我有一个静态启动成员,生产和测试项目都使用它来注入上下文。在测试项目中,这使用内存数据库
我正在编写一个集成类型测试,它调用存储库来添加然后编辑项目。
[Fact]
public void AddEditBusiness()
{
var repo = app.Services.GetService<IBusinessRepo>();
var BusinessTypeRepo = app.Services.GetService<IBusinessTypesRepo>();
var ret = repo.Add(new AddBusinessRequest()
{
DateCreated = DateTime.Now,
Name = "Test1",
NationWide = true,
State = true,
BusinessTypes = new List<AddBusinessTypesRequest>()
{
new AddBusinessTypesRequest() { BusinessTypeID = 1 },
new AddBusinessTypesRequest() {BusinessTypeID = 2 }
}
});
Task.WaitAll(ret);
var AddRes = ret.Result;
var edit = repo.Edit(new EditBusinessRequest()
{
BusinessID = AddRes.BusinessID,
Name = "EditTest1",
NationWide = false,
State = true,
DateCreated = AddRes.DateCreated
});
Task.WaitAll(edit);
var editRes = edit.Result;
Assert.Equal(editRes.BusinessID, AddRes.BusinessID);
Assert.Equal("EditTest1", editRes.Name);
Assert.Equal(false, editRes.NationWide);
var btTask = BusinessTypeRepo.GetAllBursinessTypeForBusiness(new BusinessIDRequest()
{
BusinessID = editRes.BusinessID
});
Task.WaitAll(btTask);
var bt = btTask.Result;
Assert.True(bt.Count == 2);
}
我尝试了使用异步和非异步以及 Task.Wait 的组合
问题是运行测试时失败,但调试时通过 - 即使没有断点!我想我知道发生了什么 - 我认为上下文正在被释放,因此在运行时丢失了项目,但如果是这样的话,为什么它在调试时会通过。我收到的错误是在编辑部分 - 它找不到要编辑的记录。我什至尝试将 Task.Delay(2000) 认为这是一个竞争条件。
考虑到这一点,我尝试将测试上下文设置为单例、瞬态和作用域。目前感觉我只是在尝试一些东西,因为我不明白为什么它在运行时失败但在调试时通过。
任何帮助将不胜感激。
我关注了这篇文章,一切都很有意义:
无法使用同一个 InMemory Db 跨多个 DbContext 获取更新数据
修改了存储库的接口,以便它们也继承自 IDisposable 并设置测试范围。
[Fact]
public async void AddEditBusiness2()
{
using (var repo = app.Services.GetService<IBusinessRepo>())
{
var AddRes = await repo.Add(new AddBusinessRequest()
{
DateCreated = DateTime.Now,
Name = "Test1",
NationWide = true,
State = true,
BusinessTypes = new List<AddBusinessTypesRequest>()
{
new AddBusinessTypesRequest() { BusinessTypeID = 1 },
new AddBusinessTypesRequest() {BusinessTypeID = 2 }
}
});
var editRes = await repo.Edit(new EditBusinessRequest()
{
BusinessID = AddRes.BusinessID,
Name = "EditTest1",
NationWide = false,
State = true,
DateCreated = AddRes.DateCreated
});
using (var BusinessTypeRepo = app.Services.GetService<IBusinessTypesRepo>())
{
var bt = await BusinessTypeRepo.GetAllBursinessTypeForBusiness(new BusinessIDRequest()
{
BusinessID = editRes.BusinessID
});
Assert.True(bt.Count == 2);
Assert.Equal(editRes.BusinessID, AddRes.BusinessID);
Assert.Equal("EditTest1", editRes.Name);
Assert.False(editRes.NationWide);
}
}
}