XUnit CollectionFixture实例化多次

问题描述 投票:1回答:1

我刚刚开始使用xUnit中的ClassFixtures和Collections,所以可能我做错了,但是....>

我的理解是,我可以创建一个ICollectionFixture,通过CollectionDefinitionAttribtue将其分配给一个集合,然后所有具有Collection属性且连接名称相同的测试类将共享同一夹具的实例。

所以..首先是一个简单的案例,以证明一个夹具每个测试类仅实例化一次

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++;
    }
}

[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);

    }
}

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

Test1-构造器计数:3 DisposeCount:1

似乎构造函数被称为3次!

在Fixture集合启动期间一次,然后在每个测试类中再次一次。

这里有什么?我的两个测试都绑定到同一个集合,但是每个测试类都在获取自己的测试夹具实例。

我在这里做错了还是这是一个错误? (我没有在GitHub上提及它)。

将xUnit v2.4.1与.net core 2.1一起使用

我刚刚开始使用xUnit中的ClassFixtures和Collections,所以可能我做错了,但是....我的理解是,我可以创建ICollectionFixture,并将其分配给...]]

xunit.net
1个回答
0
投票

我知道了。

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

© www.soinside.com 2019 - 2024. All rights reserved.