如何在所有测试类中共享一个夹具?

How to share one fixture among all test classes?

我想在所有测试中共享 DBfixture。这是为此目的创建的集合:

[CollectionDefinition("db")]
public class TestColDefinition : IClassFixture<DBfixture> {  }

我有一个基础 class 我从中得出我的测试 classes:

public class TestBase
{
    protected readonly ITestOutputHelper testOutputHelper;
    protected DBfixture dbf;

    public TestBase(ITestOutputHelper testOutputHelper, DBfixture dbf)
    {
        this.testOutputHelper = testOutputHelper;
        this.dbf = dbf;
    }
}

[Collection("db")]
public class TestClass1 :  TestBase
{
    public TestClass1(ITestOutputHelper testOutputHelper, DBfixture dbf) : base(testOutputHelper, dbf) { }

    [Fact]
    public void fact(){}
}

[Collection("db")]
public class TestClass2 :  TestBase
{
    public TestClass2(ITestOutputHelper testOutputHelper, DBfixture dbf) : base(testOutputHelper, dbf) { }

    [Fact]
    public void fact(){}
}

但是当我 运行 测试时,会创建两个 DBfixture 对象(每个测试一个 class)。如果没有集合,则会创建四个对象。我如何设置它以便在所有测试 classes 之间共享一个对象?

您可以使用集合夹具并在该集合下添加每个测试来实现您上面提到的。但是,如果您使用单个收集装置,那么您的整个测试将 运行 连续进行,除非您在 Xunit运行ner 配置中明确禁用它。

Xunit Docs 的观点之一: 当 运行 并行测试时,测试集合也会影响 xUnit.net 运行 测试的方式。

详情请阅读: https://xunit.net/docs/shared-context

替代方法是,使用静态 class 来存储您可以在开始测试时分配的数据库上下文,并在整个测试生命周期中使用它。