XUnit測試DbContext沒有處理

c# entity-framework-core xunit

我正在為DbContext實現一個XUnit測試,似乎DbContext沒有正確處理。當我調試第一個測試時,它可以工作,但在第二個測試中,拋出了已經添加的錯誤listAds

添加監視後,在第二個測試中, _context為null,但它在_context.Advertisements.AddRange(listAds);之前具有Advertisements_context.Advertisements.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));
    }
}

一般承認的答案

上下文被處理,但不是“內存數據庫”本身。

這是“按設計”允許您測試您測試的類正在創建自己的DBContext實例的場景 - 否則您無法為它們準備數據。

你有兩種可能性:

  1. 對於每個測試以創建“不同的數據庫” databaseName與像代碼.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())

  2. 在創建後(或在Dispose )使用context.Database.EnsureDeleted()強制數據庫銷毀/重新創建。

對於您的測試類方法2看起來更合適,但這取決於您。

文檔: https//docs.microsoft.com/en-us/ef/core/miscellaneous/testing/in-memory



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow