Свойство Lazy-init неожиданно доступно при использовании xUnit и AutoFixtureC#

Место общения программистов C#
Ответить
Anonymous
 Свойство Lazy-init неожиданно доступно при использовании xUnit и AutoFixture

Сообщение Anonymous »

Предположим, у меня есть следующий класс (который является минимальной копией моей реальной проблемы):
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»