Используя AutoFixture 3.50 и xUnit.NET, кажется, что есть разница между тем, как Fixture.Create()
создает конкретные объекты, и тем, как тесты AutoData Theory создают конкретные объекты.
Простой пример:
public class Foo
{
private string prop;
public string Prop
{
get
{
if (prop == null) { prop = "Prop"; } // Breakpoint 'A'
return prop;
}
}
}
Протестируйте с помощью Fixture
:
[Fact]
public void FixtureTest()
{
var fixture = new Fixture();
var result = fixture.Create<Foo>(); // Breakpoint 'B1'
}
Протестируйте с помощью AutoDataAttribute
:
[Theory, AutoData]
public void AutoDataTest(Foo sut)
{
var bar = 1; // Essential no-op, Breakpoint 'B2'
}
В первом тесте точка останова «B1» срабатывает, а точка останова «A» никогда не срабатывает. В последнем тесте точка останова «A» срабатывает раньше, чем точка останова «B2». Это проблематично, когда у меня есть "лениво" инициализированное свойство, не отличающееся от приведенного выше - поскольку поле поддержки свойства инициализируется до запуска теста, я не могу проверить логику инициализации.
Есть ли способ настроить AutoDataAttribute
, чтобы обойти это поведение? А может быть, это баг?