C# XUnit测试DbContext未处理
我正在为DbContext实现一个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
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看起来更合适,但这取决于您
文件: