.Net核心单元测试(xunit)-处理数据库

时间:2019-06-12 14:16:39

标签: unit-testing .net-core xunit

因此,我有几个读取或写入MySql数据库的单元测试。我首先使用new DbContextOptionsBuilder<Context>().UseInMemoryDatabase在内存中创建了一个数据库。那很好。

但是,我需要一些MySQL Json columns,而InMemoryDatabase不支持那些(例如:public System.JsonObject<object> EventData { get; set; })。由于它们似乎特定于MySQL。

所以我想,我需要在一个真实的MySQL数据库上进行测试,但是我遇到了一些麻烦。

当我创建上下文时,我在MySQL中创建了一个新数据库,并将Migrations推送到该数据库。效果很好:

//First create the schema
var options = new DbContextOptionsBuilder<MyContext>()
      .UseMySql(config["ConnectionStrings:MyConnectionString"])
      .Options;
_context = new MyContext(options);
_context.Database.ExecuteSqlCommand("CREATE SCHEMA `MySchema`");


//Use the database
options = new DbContextOptionsBuilder<MyContext>()
     .UseMySql(config["ConnectionStrings:MyConnectionString"] + ";database=MySchema")
     .Options;
_context = new MyContext(options);

//Add migrations
_context.Database.Migrate();

问题是:

  • 当我一次运行多个测试时,将再次为每个测试创建数据库。在执行它们时,会出现异步错误,因为所有正在运行的测试都希望同时创建相同的数据库。另外,由于某些单元测试用一些测试数据填充表(某些测试共享相同的数据,例如具有相同ID的用户),所以事情变得混乱了。

所以我可以为每个测试创建一个随机的唯一数据库名称,但我怀疑这是否可行。

此外,所有测试完成后如何清理?如果我要使用唯一的数据库名称选项,则可以使用上下文处理方法。但是那应该怎么做?

0 个答案:

没有答案