我已经使用 xUnit、共享类夹具和依赖项注入为我的 .Net Core API 实现了集成测试,因此我可以使用WebApplicationFactory。
public class DatabaseFixture : WebApplicationFactory<Startup> {
public DatabaseFixture(WebApplicationFactory<Startup>) {
//Initialize Stuff
}
}
public class SaveTests : IClassFixture<DatabaseFixture> {
private DatabaseFixture databaseFixture;
public SaveTests(DatabaseFixture databaseFixture)
{
this.applicationFixture = applicationFixture;
}
//Tests.....
}
public class SaveTests2 : IClassFixture<DatabaseFixture> {
private DatabaseFixture databaseFixture;
public SaveTests2(DatabaseFixture databaseFixture)
{
this.applicationFixture = applicationFixture;
}
//Tests.....
}
这效果很好,但是,每个测试文件的测试数据都已初始化。
我希望更新我的测试以使用 Collection Fixture 而不是 Class Fixture,但是在注入 WebApplicationFactory 时我无法实现 Collection Fixture。
[CollectionDefinition("SaveTestCollection")]
public class SaveTestCollectionFixture : ICollectionFixture<DatabaseFixture>
{
}
public class DatabaseFixture : WebApplicationFactory<Startup> {
public DatabaseFixture(WebApplicationFactory<Startup>) {
//Initialize Stuff
}
}
[Collection("SaveTestCollection")]
public class SaveTests
{
DatabaseFixture fixture;
public SaveTests(DatabaseFixture fixture)
{
this.fixture = fixture;
}
}
我得到的错误是:
System.AggregateException : One or more errors occurred. (Collection fixture type 'DatabaseFixture' had one or more unresolved constructor arguments: WebApplicationFactory) (The following constructor parameters did not have matching fixture data: DatabaseFixture fixture)
---- Collection fixture type 'DatabaseFixture' had one or more unresolved constructor arguments: WebApplicationFactory`1 factory
---- The following constructor parameters did not have matching fixture data: DatabaseFixture fixture
我知道依赖注入失败了,但我不知道如何修复它。
所以我的问题是,我是否能够通过依赖注入包含 WebApplicationFactory,或者我是否需要更改设置才能使用 Collection Fixtures?
非常感谢任何帮助
您确实希望为每个测试文件运行数据初始化。您最初的方法是正确的。否则,您将面临为测试创建共享数据库的风险,这是您应该避免的,因为它可能会根据测试执行顺序破坏您的测试。
一个示例 - 您有一个集成测试,用于获取名为“John Doe”的用户帐户的详细信息。然后,您进行另一个测试,删除名为“John Doe”的用户帐户。假设您有一个共享数据库,所有测试仅播种一次,这些测试仅在按特定顺序执行时才有效,即首先获取,然后删除。如果颠倒顺序,提取将会失败,因为删除测试会删除提取测试试图获取的资源。
当然,如果您的播种过程需要很长时间,您可能需要对其进行优化,例如准备一个最低限度的种子,或者为不同类型的测试准备不同的种子,因为有时您不需要播种整个数据库来检查表中是否存在记录。总有一些方法可以让它更快一点,并且通常这是值得的,因为您进行的集成测试越多,总执行时间的差异就越明显。