C# XUnit测试DbContext未处理

C# XUnit测试DbContext未处理,c#,entity-framework-core,xunit,C#,Entity Framework Core,Xunit,我正在为DbContext实现一个XUnit测试,似乎DbContext没有正确处理。当我调试第一个测试时,它工作了,但是在第二个测试中,抛出了一个已经添加的错误listAds 添加手表后,在第二个测试中,\u context为空,但它在\u context.advisions.AddRange(listAds)之前有广告的值被调用 public class AdsServiceTest: IDisposable { private readonly DbContextOptions&l

我正在为DbContext实现一个XUnit测试,似乎DbContext没有正确处理。当我调试第一个测试时,它工作了,但是在第二个测试中,抛出了一个已经添加的错误
listAds

添加手表后,在第二个测试中,
\u context
为空,但它在
\u context.advisions.AddRange(listAds)之前有
广告的值被调用

public class AdsServiceTest: IDisposable
{
    private readonly DbContextOptions<SensingSiteDbContext> _options;
    private readonly SensingSiteDbContext _context;
    private readonly AdsService _AdsService;

    public AdsServiceTest()
    {
        //initialize db options
        _options = new DbContextOptionsBuilder<SensingSiteDbContext>()
            .UseInMemoryDatabase()
            .Options;

        //get service
        _context = new SensingSiteDbContext(_options);

        //initialize dbcontext
        List<Ads> listAds = new List<Ads>() {
            new Ads(){  Id=1,AdsName="Ads1", Deleted=false},
            new Ads(){  Id=2,AdsName="Ads2", Deleted=false},
            new Ads(){  Id=3,AdsName="Ads3", Deleted=false}
        };

        //In the second test method, it throw errors, listAds already exist in 
        _context.Advertisements.AddRange(listAds);
        _context.SaveChanges();
        BaseLib.SSDbContext<Ads, AdsService> ssDbContent = new BaseLib.SSDbContext<Ads, AdsService>(_context);
        _AdsService = ssDbContent.GetService((x, y) => new AdsService(x, y));

    }

    public void Dispose()
    {
        _context.Dispose();            
    }

    [Theory]
    [InlineData(1)]
    public void FindById(int id)
    {
        Ads adsResult = _AdsService.FindById(id);
        Ads adsTarget = _context.Advertisements.Find(id);
        Assert.Equal(adsResult.AdsName, adsTarget.AdsName);
        //Assert.True(adsTarget.Equals(adsResult));
    }

    [Fact]
    public void GetAll()
    {
        var adsResult = _AdsService.GetAll();
        var adsTarget = _context.Advertisements.ToList();
        Assert.Equal(adsResult.Count(),adsTarget.Count());
        //Did not work all the time
        //Assert.True(adsTarget.Equals(adsResult));
    }
}
公共类AdsServiceTest:IDisposable
{
私有只读DbContextOptions\u选项;
私有只读SensingSiteDbContext\u context;
专用只读AdsService\U AdsService;
公共AdsServiceTest()
{
//初始化数据库选项
_options=new DbContextOptionsBuilder()
.UseInMemoryDatabase()的用法
.选择;
//得到服务
_上下文=新的SensingSiteDbContext(_选项);
//初始化dbcontext
List listAds=新列表(){
新建Ads(){Id=1,AdsName=“Ads1”,Deleted=false},
新建Ads(){Id=2,AdsName=“Ads2”,Deleted=false},
新建Ads(){Id=3,AdsName=“Ads3”,Deleted=false}
};
//在第二种测试方法中,它抛出错误,listAds已经存在于
_context.advisions.AddRange(listAds);
_SaveChanges();
BaseLib.SSDbContext ssDbContent=新的BaseLib.SSDbContext(_context);
_adssservice=ssDbContent.GetService((x,y)=>newadssservice(x,y));
}
公共空间处置()
{
_context.Dispose();
}
[理论]
[在线数据(1)]
公共void FindById(int id)
{
Ads adsResult=\u AdsService.FindById(id);
Ads adsTarget=\u context.advisions.Find(id);
Assert.Equal(adsResult.AdsName、adsTarget.AdsName);
//True(adsTarget.Equals(adsResult));
}
[事实]
public void GetAll()
{
var adsResult=_AdsService.GetAll();
var adsTarget=_context.advisions.ToList();
Assert.Equal(adsResult.Count(),adsTarget.Count());
//没有一直工作
//True(adsTarget.Equals(adsResult));
}
}

上下文被释放,但不是“内存数据库”本身

这是“按设计”的,允许您测试您正在创建自己的DBContext实例的类的场景——否则您无法为它们准备数据

你有两种可能:

  • 使用
    databaseName
    和类似
    的代码为每个测试创建“不同的数据库”。使用内存数据库(databaseName:Guid.NewGuid().ToString())

  • 创建后(或在
    Dispose
    中),使用
    context.database.EnsureDeleted()强制销毁/重新创建数据库

  • 对于您的测试类,方法2看起来更合适,但这取决于您

    文件: