2017-04-14 12 views
0

DbContextのXUnitテストを実装していますが、DbContextが正しく処理されなかったようです。私は最初のテストをデバッグすると動作しますが、2回目のテストではエラーが発生します。エラーにはlistAdsが既に追加されています。
時計を追加した後、2番目のテストでは_contextはnullですが、Advertisementsの値は_context.Advertisements.AddRange(listAds);の前になります。XUnitテストDbContextが処理されなかった

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)); 
    } 
} 

答えて

2

コンテキストは配置されていますが、「インメモリデータベース」自体は配置されていません。

これは、テストするクラスが自分自身のインスタンスのDBContextを作成しているシナリオをテストできるように設計されており、それ以外の場合はデータを準備できません。

  1. は、作成後に(またはDispose中)context.Database.EnsureDeleted()で再作成/破壊.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())

  2. ForceデータベースのようなコードでdatabaseNameと各テストのために、 "異なるデータベース" を作成します。

    は、次の2つの可能性があります。

あなたのテストクラスの方法2の方が適していますが、それはあなた次第です。

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

関連する問題