Я только начинаю с 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