public class InitOnce
where T : struct
{
private T? _value;
public T DefaultValue { get; set; }
public T Value => _value ??= DefaultValue;
}
Используя xUnit и AutoFixture, я хотел бы написать модульный тест, который проверяет следующее:
- Первый При доступе к значению оно инициализируется текущим значением DefaultValue.
- Любые последующие изменения DefaultValue игнорируются.
private static void RunTest(InitOnce initOnce)
{
initOnce.DefaultValue = 1;
Assert.Equal(1, initOnce.Value);
initOnce.DefaultValue = 2;
Assert.Equal(1, initOnce.Value);
}
Если я явно создаю InitOnly в теле теста, тест проходит:
[Theory]
[AutoData]
public void Test1(IFixture fixture)
{
InitOnce initOnce = fixture.Build().OmitAutoProperties().Create();
RunTest(initOnce); // PASS
}
Я хотел бы исключить шаблонный код настройки и внедрить экземпляр InitOnce:
[Theory]
[AutoData]
public void Test2([NoAutoProperties] InitOnce initOnce)
{
RunTest(initOnce); // FAIL - why?
}
Но Test2 неожиданно завершается со следующей ошибкой, независимо от того, запущен ли он с помощью обозревателя тестов Visual Studio или теста dotnet:
< blockquote>
Ошибка Assert.Equal(): значения различаются
Ожидается: 1
Фактическое: 0
Видимо, что-то обращается к свойству Value до того, как RunTest изменит значение DefaultValue с 0 на 1. Почему это происходит и как я могу добиться прохождения Test2? >
Я ориентируюсь на .NET 8.0 и использую последние версии этих пакетов:
all
runtime; build; native; contentfiles; analyzers; buildtransitive
Подробнее здесь: https://stackoverflow.com/questions/793 ... utofixture
Мобильная версия