xUnit 提供了(共享)类装置的概念,如中所述测试之间共享上下文 https://xunit.net/docs/shared-context。到目前为止我还没有弄清楚是否有一种方法可以对此类装置进行参数化。例如,如果DatabaseFixture
应该用一些测试数据来丰富,这取决于它所运行的测试?测试类可能想要插入测试数据,但仅once然后针对该数据库(夹具)运行所有测试。
换句话说,如果// ... initialize data in the test database ...
从文档(上面引用)还取决于测试?因为并非所有测试都希望拥有相同的测试数据。实际上,我什至认为很多时候测试定义自己的测试数据而不是在测试数据级别上耦合测试是一种很好的做法。
就解决方法而言我正在做的是提供ConfiguredWith
接受仅执行一次的回调的方法。为此,我需要延迟测试数据库的初始化,以便确保配置选项已设置。就像是:
public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
DatabaseFixture fixture;
public MyDatabaseTests(DatabaseFixture fixture)
{
this.fixture = fixture;
this.fixture.ConfigureWith(new DatabaseFixtureOptions
{
InitTestData = db => db.Insert(...);
};
}
// ...
}
对于针对数据库编写测试时感觉像是标准要求的东西来说,这看起来相当人为。
如果 xUnit 不提供开箱即用的功能,也许有人有更好的模式来解决这个问题。
这个问题 https://stackoverflow.com/questions/28211431/are-there-parameterized-test-fixtures-for-xunit似乎朝着类似的方向发展,但我不一定固定在具有该结构的解决方案上。
我学到了尝试共享实体框架数据库上下文的艰难方法IClassFixture
or CollectionFixtures
由于 xUnit 的并行执行,最终会导致测试被另一个测试数据污染或死锁/竞争条件,实体框架会抛出异常,因为它已经使用给定的 Id 跟踪该对象,还有更多类似的麻烦。
就我个人而言,我建议针对您的特定使用原因,将数据库上下文创建/清理放在constructor/dispose
替代方案例如:
public class TestClass : IDisposable
{
DatabaseContext DatabaseContext;
public TestClass()
{
var options = new DbContextOptionsBuilder<DatabaseContext>()
.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
.Options;
DatabaseContext = new DatabaseContext(options);
//insert the data that you want to be seeded for each test method:
DatabaseContext.Set<Product>().Add(new Product() { Id = 1, Name = Guid.NewGuid().ToString() });
DatabaseContext.SaveChanges();
}
[Fact]
public void FirstTest()
{
var product = DatabaseContext.Set<Product>().FirstOrDefault(x => x.Id == 1).Name;
//product evaluates to => 0f25a10b-1dfd-4b4b-a69d-4ec587fb465b
}
[Fact]
public void SecondTest()
{
var product = DatabaseContext.Set<Product>().FirstOrDefault(x => x.Id == 1).Name;
//product evaluates to => eb43d382-40a5-45d2-8da9-236d49b68c7a
//It's different from firstTest because is another object
}
public void Dispose()
{
DatabaseContext.Dispose();
}
}
当然你总是可以做一些改进,但想法就在那里
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)