首页 > 解决方案 > xUnit IClassFixture 构造函数被多次调用

问题描述

我正在使用 xUnit 进行集成测试。为此,我使用了一个 localdb 实例。话虽如此,我想用一些预定义的数据启动一次数据库实例,当然我会在所有测试用例中保持不变。我可以编写隔离的每个测试用例,这样它们就不会相互碰撞,但是我只想创建一次数据库实例。

在每次测试之前都按照 xunit 构造函数运行,代码看起来像

//similar to base class
public class DatabaseFixture : IDisposable
{
    public SqlConnection Db { get; private set; }
    public DatabaseFixture()
    {
        InitialDB();
    }
    public InitialDB()
    {
        CreateDBInstance();
        CreateDBSchemas();
        InitDBMetaData();
    }

    public void Dispose()
    {
        // clean up test data from the database
        CleanUpDB();
    }
}

//Class where you want to use shared class instance
public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
    DatabaseFixture dbFixture;
    public MyDatabaseTests(DatabaseFixture fixture)
    {
        this.dbFixture = fixture;
    }

// write tests, using dbFixture.Db to get access to the SQL Server
}

我面临的问题是我注意到每个测试用例每次都会调用这个 DBFixture。我认为 iClassFixture 只调用一次。当测试用例并行运行时会带来问题,因为它试图清理数据库,而其他测试试图访问它,并且多个测试用例会尝试同时创建数据库,这会导致错误。https://xunit.net/docs/shared-context.html

谁能阐明为什么它不起作用?

标签: integration-testingxunitdbunit

解决方案


您需要改用 Collection Fixtures。

https://xunit.net/docs/shared-context#collection-fixture

何时使用:当你想创建一个单独的测试上下文并在多个测试类中的测试之间共享它,并在测试类中的所有测试完成后清理它。


推荐阅读