xUnit - 将 WebApplicationFactory 与 CollectionFixture 结合使用进行 .Net Core 集成测试

问题描述 投票:0回答:1

我已经使用 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?

非常感谢任何帮助

c# asp.net-core integration-testing xunit fixtures
1个回答
0
投票

您确实希望为每个测试文件运行数据初始化。您最初的方法是正确的。否则,您将面临为测试创建共享数据库的风险,这是您应该避免的,因为它可能会根据测试执行顺序破坏您的测试。

一个示例 - 您有一个集成测试,用于获取名为“John Doe”的用户帐户的详细信息。然后,您进行另一个测试,删除名为“John Doe”的用户帐户。假设您有一个共享数据库,所有测试仅播种一次,这些测试仅在按特定顺序执行时才有效,即首先获取,然后删除。如果颠倒顺序,提取将会失败,因为删除测试会删除提取测试试图获取的资源。

当然,如果您的播种过程需要很长时间,您可能需要对其进行优化,例如准备一个最低限度的种子,或者为不同类型的测试准备不同的种子,因为有时您不需要播种整个数据库来检查表中是否存在记录。总有一些方法可以让它更快一点,并且通常这是值得的,因为您进行的集成测试越多,总执行时间的差异就越明显。

© www.soinside.com 2019 - 2024. All rights reserved.