XUnit CollectionFixture 多次实例化

我刚刚开始使用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);

        

    }

}

运行测试,它们都通过了。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++;

    }

}


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


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


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


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


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


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


潇湘沐
浏览 98回答 1
1回答

长风秋雁

我想到了。使用 Fixture 集合时,测试类不应实现 IClassFixture 接口。改变[Collection("SampleFixture")]public class SampleTestClass1&nbsp; : IClassFixture<SampleFixture>{...}到[Collection("SampleFixture")]public class SampleTestClass1&nbsp; // <-- Removed IClassFixture<SampleFixture>{...}解决了问题。
打开App,查看更多内容
随时随地看视频慕课网APP