XUnit CollectionFixture 多次实例化

cda*_*igo 7 c# xunit.net

我刚刚开始使用xUnitClassFixtures中的集合,因此我可能做错了,但我的理解是我可以创建一个,通过将其分配给集合,然后所有具有ICollectionFixture<MyFixture>CollectionDefinitionAttribtueCollection,然后所有具有该属性的相同的连接名称将共享固定装置的相同实例。

首先用一个简单的例子来证明Fixture每个测试类只实例化一次

public class SampleFixture:IDisposable
{
    public static int ConstructorCount { get; set; }
    public static int DisposeCount { get; set; }

    public SampleFixture()
    {
        ConstructorCount++;
    }


    public void Dispose()
    {
        DisposeCount++;
    }
}

public class SampleTestClass1 : IClassFixture<SampleFixture>
{
    private readonly ITestOutputHelper outputHelper;
    private readonly SampleFixture sampleFixture;

    public SampleTestClass1(ITestOutputHelper outputHelper, SampleFixture sampleFixture)
    {
        this.outputHelper = outputHelper;
        this.sampleFixture = sampleFixture;
    }
    [Fact]
    public void Test1()
    {
        this.outputHelper.WriteLine($"Test1 - Constructor Count: {SampleFixture.ConstructorCount} DisposeCount: {SampleFixture.DisposeCount}");
        Assert.Equal(1,SampleFixture.ConstructorCount);
    }

    [Fact]
    public void Test2()
    {
        this.outputHelper.WriteLine($"Test2 - Constructor Count: {SampleFixture.ConstructorCount} DisposeCount: {SampleFixture.DisposeCount}");
        Assert.Equal(1,SampleFixture.ConstructorCount);
        
    }
}
Run Code Online (Sandbox Code Playgroud)

运行测试,它们都通过了。1 通过构造函数意味着测试类中的两个测试都使用我的装置的同一实例。凉豆子。

现在让我们创建一个CollectionFixture,添加另一个测试类并使用相同的Collection属性装饰它们。

[CollectionDefinition("SampleFixture")]
public class SampleFixtureCollection : ICollectionFixture<SampleFixture>
{
    
}
public class SampleFixture:IDisposable
{
    public static int ConstructorCount { get; set; }
    public static int DisposeCount { get; set; }

    public SampleFixture()
    {
        ConstructorCount++;
    }


    public void Dispose()
    {
        DisposeCount++;
    }
}

[Collection("SampleFixture")]
public class SampleTestClass1 : IClassFixture<SampleFixture>
{
    private readonly ITestOutputHelper outputHelper;
    private readonly SampleFixture sampleFixture;

    public SampleTestClass1(ITestOutputHelper outputHelper, SampleFixture sampleFixture)
    {
        this.outputHelper = outputHelper;
        this.sampleFixture = sampleFixture;
    }
    [Fact]
    public void Test1()
    {
        this.outputHelper.WriteLine($"Test1 - Constructor Count: {SampleFixture.ConstructorCount} DisposeCount: {SampleFixture.DisposeCount}");
        Assert.Equal(1,SampleFixture.ConstructorCount);
    }

    [Fact]
    public void Test2()
    {
        this.outputHelper.WriteLine($"Test2 - Constructor Count: {SampleFixture.ConstructorCount} DisposeCount: {SampleFixture.DisposeCount}");
        Assert.Equal(1,SampleFixture.ConstructorCount);
        
    }
}

[Collection("SampleFixture")]
public class SampleTestClass2 : IClassFixture<SampleFixture>
{
    private readonly ITestOutputHelper outputHelper;
    private readonly SampleFixture sampleFixture;

    public SampleTestClass2(ITestOutputHelper outputHelper, SampleFixture sampleFixture)
    {
        this.outputHelper = outputHelper;
        this.sampleFixture = sampleFixture;
    }
    [Fact]
    public void Test1()
    {
        this.outputHelper.WriteLine($"Test1 - Constructor Count: {SampleFixture.ConstructorCount} DisposeCount: {SampleFixture.DisposeCount}");
        Assert.Equal(1,SampleFixture.ConstructorCount);
    }

    [Fact]
    public void Test2()
    {
        this.outputHelper.WriteLine($"Test2 - Constructor Count: {SampleFixture.ConstructorCount} DisposeCount: {SampleFixture.DisposeCount}");
        Assert.Equal(1,SampleFixture.ConstructorCount);
        
    }
}   
Run Code Online (Sandbox Code Playgroud)

现在我所有的测试都失败了。查看第二个测试类中失败测试的消息:

测试 1 - 构造函数计数:3 DisposeCount:1

看来构造函数被调用了3 次! 在夹具收集启动期间一次,然后为每个测试类再一次。

这里给出了什么?我的两个测试都绑定到同一个集合,但每个测试类都获得自己的测试装置实例。

我在这里做错了什么还是这是一个错误?(我在 GitHub 中没有发现任何提及)。

将 xUnit v2.4.1 与 .net core 2.1 结合使用

cda*_*igo 10

我想到了。

使用 Fixture 集合时,测试类不应实现 IClassFixture 接口。

改变

[Collection("SampleFixture")]
public class SampleTestClass1  : IClassFixture<SampleFixture>
{...}
Run Code Online (Sandbox Code Playgroud)

[Collection("SampleFixture")]
public class SampleTestClass1  // <-- Removed IClassFixture<SampleFixture>
{...}
Run Code Online (Sandbox Code Playgroud)

解决了问题。