XUnit InmemoryDB 调试测试通过但运行时失败

问题描述 投票:0回答:1

我有一个静态启动成员,生产和测试项目都使用它来注入上下文。在测试项目中,这使用内存数据库

我正在编写一个集成类型测试,它调用存储库来添加然后编辑项目。

 [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) 认为这是一个竞争条件。

考虑到这一点,我尝试将测试上下文设置为单例、瞬态和作用域。目前感觉我只是在尝试一些东西,因为我不明白为什么它在运行时失败但在调试时通过。

任何帮助将不胜感激。

c# entity-framework xunit.net
1个回答
0
投票

我关注了这篇文章,一切都很有意义:

无法使用同一个 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);
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.