Почему использование NSubstitue.Arg.Any‹string› в одной группе модульных тестов приводит к сбою последнего теста в другом наборе

У нас была очень странная ошибка, из-за которой запуск нашего полного набора модульных тестов с набором новых UnitTest всегда приводил к сбою последнего тестового запуска в новом разделе (с использованием ReSharper и NUnit для проекта Unity3D). Однако при запуске нового набора все тесты будут пройдены.

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

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

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

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

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


person Colton White    schedule 25.05.2016    source источник


Ответы (1)


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

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

person David Tchepak    schedule 26.05.2016
comment
Рад узнать, что есть хоть какое-то реальное основание для того, что мы видели! Спасибо за информацию! - person Colton White; 26.05.2016