XUnit CollectionFixture создание экземпляра несколько раз - PullRequest
1 голос
/ 28 сентября 2019

Я только начинаю с ClassFixtures и Collections в xUnit, так что возможно я делаю это неправильно, но ....

Насколько я понимаю, я могу создать ICollectionFixture, назначить егоcollection через CollectionDefinitionAttribtue, а затем все тестовые классы, имеющие атрибут Collection с одинаковым именем соединения, будут использовать один и тот же экземпляр устройства.

итак. Сначала простой случай, чтобы доказать, что 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, добавим еще один тестовый класс и украсим оба с одним и тем же атрибутом коллекции.

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

    }
}

Теперь все мои тесты не пройдены.Проверьте это сообщение из проваленного теста во 2-м классе теста:

Test1 - Количество конструкторов: 3 DisposeCount: 1

Похоже, конструктор называется 3 раза! Один раз во время запуска коллекции приборов, а затем еще раз для каждого тестового класса.

Что здесь дает?Оба моих теста привязаны к одной и той же коллекции, но у каждого тестового класса есть свой экземпляр тестового набора.

Я что-то здесь не так сделал или это ошибка?(Я не нашел упоминания об этом в GitHub).

Использование xUnit v2.4.1 с .net core 2.1

1 Ответ

0 голосов
/ 28 сентября 2019

Я понял это.

При использовании коллекций Fixture тестовые классы не должны реализовывать интерфейс IClassFixture.

Изменение

[Collection("SampleFixture")]
public class SampleTestClass1  : IClassFixture<SampleFixture>
{...}

на

[Collection("SampleFixture")]
public class SampleTestClass1  // <-- Removed IClassFixture<SampleFixture>
{...}

решило проблему.

...