如何防止在多种测试方法之间共享Sqlite内存存储

时间:2019-01-01 16:58:45

标签: c# sqlite unit-testing .net-core xunit

技术:.Net Core,Sqlite内存,C#,Xunit

我正在尝试使用Sqlite Inmemory Provider通过Xunit模拟数据库。我想在每次测试执行时都有一个新存储(文​​本数据集)。但是Store似乎在多种测试方法之间共享,因此,我的测试结果出现异常。

这是我的代码。我正在为每个测试执行创建一个新的Sqlite连接,并将其放置在最后。测试执行是连续的还是并行的,无可厚非。

[Theory]
[InlineData(1)]
[InlineData(3)]
public async Task WhenPassingValidId_ReturnRecord(int id)
{
  using (var connection = new SqliteConnection("DataSource=:memory:"))
  {
       connection.Open();

       var options = DbHelper.GetSqliteContextOptions(connection);

       using (IDataContext context = new DataContext(options))
       {
           await SetupTestDataAsync(context);
       }

       using (IDataContext context = new DataContext(options))
       {
           var service = new LookupService(context);

           var lookup = await service.GetAsync(id);

           Assert.NotNull(lookup);
        }
   }              
}

private async static Task SetupTestDataAsync(IDataContext context)
{
        context.LookupHeaders.AddRange(GetLookupHeaders());
        await context.SaveChangesAsync();

        context.Lookups.AddRange(GetLookups());
        await context.SaveChangesAsync();
}

public static DbContextOptions<DataContext> GetSqliteContextOptions(SqliteConnection connection)
{
        var options = new DbContextOptionsBuilder<DataContext>()
               .UseSqlite(connection)
               .Options;

        using (var context = new DataContext(options, CreateRequestContext()))
        {
            context.Database.EnsureCreated();           
        }

        return options;
}

是否有一种方法可以将Sqlite内存数据库的作用域限定为一种测试方法?

谢谢。

0 个答案:

没有答案