Исключение при использовании более двух макетов в тесте - PullRequest
0 голосов
/ 11 июля 2019

Я пишу тест, используя xUnit 2 и AutoFixture для проекта .Net Core 2.2. Мне требуется три Мока в тесте, чтобы удовлетворить тестируемой системе, и ранее AutoFixture не имела проблем с этим. Однако теперь, когда я добавляю в тестовую сигнатуру более двух макетов, я получаю исключение.

[Theory]
[AutoData]
public void ContrivedTest(
   Mock<IDependencyOne> mockDependencyOne,
   Mock<IDependencyTwo> mockDependencyTwo)
{
    Assert.True(true);
}

Будет работать как положено, но:

[Theory]
[AutoData]
public void ContrivedTest(
   Mock<IDependencyOne> mockDependencyOne,
   Mock<IDependencyTwo> mockDependencyTwo,
   Mock<IDependencyThree> mockDependencyThree)
{
    Assert.True(true);
}

Выдает следующее исключение:

---- System.Reflection.TargetInvocationException: Исключение было сгенерировано целью вызова.

-------- System.ArgumentOutOfRangeException: указанный аргумент находится вне диапазона допустимых значений. Имя параметра: значение

Этот вопрос (почти дословно) недавно задавался на AutoFixture Github , но предоставлен ответ:

AutoData и InlineAutoData не узнают о Moq, когда вы просто устанавливаете пакет AutoFixture.AutoMoq. Вместо этого вы должны создать свои собственные атрибуты данных, полученные из значений по умолчанию, настроить приспособление с поддержкой Moq и использовать их

Не имеет смысла для меня. Почему должны работать две насмешки, а не три? Как помогает создание моего собственного атрибута данных и как именно я должен настроить прибор с поддержкой Moq?

Стоит отметить, что я не использую AutoMoq, как мне никогда не было нужно в прошлом. Я мог бы так же легко примерить макеты самостоятельно в тесте, и я собираюсь сделать это так, как мне нужно, чтобы это работало, но мне любопытно, почему что-то, что раньше работало просто отлично, перестало работать: я все время использовал это неправильно и это просто сработало по счастливой случайности?

1 Ответ

1 голос
/ 11 июля 2019

Autofixture использует циклический перебор для присвоения значений по умолчанию, поэтому он терпит неудачу на 3 пробах. Это объяснение на странице проблем с автокреплением.

Проблема возникает, когда AutoFixture пытается автоматически назначить свойства недавно созданный объект Mock. Сгенерированное автоматически свойство DefaultValue не очень хорошо подходит, поэтому Moq терпит неудачу. Для перечисления значений AutoFixture использует стратегию циклического перебора, которая объясняет, почему случай с 2 mocks работает, в то время как 3 mocks начинают разбивать его.

Вы можете прочитать полный комментарий здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...