2016-05-25 1 views
1

У нас была очень странная ошибка, когда запуск нашего полного модульного тестового набора с набором новых UnitTests всегда терпел неудачу последний тестовый прогон в новом разделе (с использованием ReSharper и NUnit для проекта Unity3D). Однако запуск нового набора сам по себе будет проходить все тесты.Почему использование NSubstitue.Arg.Any <string> в одной группе единичных тестов приводит к сбою последнего теста в другом наборе

Что было странно, так это то, что изменение наименования неудачных юнит-тестов приведет к тому, что весь набор пройдет как бы случайным образом. Мы удалили мир «_Multiple», и он, похоже, работал до тех пор, пока мы не добавили новый тест, и что он потерпел неудачу, но в нем вообще не было слова «_Multiple». На данный момент я знал, что именование было красной селедкой, а не причиной этой проблемы. Он также был протестирован на нескольких машинах и всегда испытывал такое же поведение.

Мы закончили сужая провал вниз, когда он был запущен с набором модульных тестов, который с помощью Arg.Any на не NSubstitute объект, который в основном управлял

Assert.That(!string.Equals("Desired Value", Arg.Any<string>())); 

После того, как мы обнаружили, что это было ясно, что я неправильно использовал функцию Arg.Any().

Вопрос в том, почему изменение имен функций влияет на тесты вообще? И почему бы переименовать все тесты только для того, чтобы быть test1(), test2(), test3() и т. Д., Разрешить все тесты проходить каждый раз, когда более описательное имя не будет?

ответ

2

NSubstitute делает отвратительные вещи со статическим состоянием, чтобы получить свой особый синтаксис. Arg.xyz вызывает добавление спецификаций аргументов в глобальную очередь, и они очищаются после вызова вызова.

Я предполагаю, что изменение имен тестов приводит к изменению порядка их запуска, что, в свою очередь, приводит к тому, что проблема подвергается или скрывается. В одном конкретном заказе делается вызов к замене, которое очищает ошибочную спецификацию Arg.Any<string>(), тогда как при другом заказе спецификация заставляет реальный вызов обрабатываться как конфигурирование значения заглушки или выбрасывается из-за несоответствующего аргумента.

+0

Рад узнать, что в действительности существует хотя бы некоторый базис за то, что мы видели! Спасибо за информацию! –

Смежные вопросы