【问题标题】:xUnit IClassFixture constructor being called multiple timesxUnit IClassFixture 构造函数被多次调用
【发布时间】:2020-05-05 00:00:48
【问题描述】:

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

我关注了xunit constructor runs before each test,代码看起来像

//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

谁能解释为什么它不起作用?

【问题讨论】:

  • 顺便说一句,我试图在夹具类的 dispose 方法中设置断点。我有 4 个测试,当其中两个变成绿色时,它会触发处理。当然,剩下的两个会失败

标签: integration-testing xunit dbunit


【解决方案1】:

您需要改用 Collection Fixtures。

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

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

【讨论】:

    【解决方案2】:

    我偶然发现了同样的问题,这是 Visual Studio 的问题: https://github.com/xunit/xunit/issues/2347#issuecomment-983586580

    右键单击包含测试的类文件以启动测试运行器,可能会导致此行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 2012-09-24
      相关资源
      最近更新 更多