NSubstitute Argument Matcher Ошибки только в сборке TFS
У меня возникла проблема, при которой тесты на моем локальном компьютере выполнялись с использованием Visual Studio, но они не пройдены, когда CI Build запустит их на моем сервере TFS.
Вот строка, которая терпит неудачу, и предыдущая строка для контекста.
var mockEventRepository = Substitute.For<IEventRepository>();
mockEventRepository.GetAll().ReturnsForAnyArgs(r => new List<Event>().AsQueryable());
Обратите внимание, что АРГУМЕНТОВ НЕ СООТВЕТСТВУЕТ Ни одного во всем тесте.
TFS выдаст ошибку:
NSubstitute.Exceptions.UnexpectedArgumentMatcherException: Сопоставители аргументов (Arg.Is, Arg.Any) должны использоваться только вместо аргументов членов. Не используйте в выражении Returns() или где-либо еще вне вызова участника.
В двух словах, ошибки кажутся постоянными (те же самые ошибки), когда они происходят, но они также, по-видимому, происходят случайно или не возникают.
Например... Это просто удалось после постановки в очередь следующей идентичной сборки после сбоя оригинальной. Однако в тот раз это не удалось, когда он попробовал ту же сборку с другой конфигурацией с другой, но похожей и ошибочной ошибкой:
NSubstitute.Exceptions.AmbiguousArgumentsException: Невозможно определить спецификации аргументов для использования.
К сведению, используя TFS 2015 и VS 2015.
2 ответа
Короче говоря, вся проблема была вызвана старым тестом, в котором было найдено совпадение Arg без использования NSubstitute.
Урок, который я усвоил здесь, заключается в том, что этот тип сценария может привести к очень неточным ошибкам, и я призываю любого, кто испытывает проблему, подобную этой, пересмотреть все случаи использования сопоставлений Arg.
Я видел эту проблему при использовании NSubstitute с xunit, который по умолчанию запускает тестовые классы параллельно. У NSubstitute должны быть проблемы с многопоточностью, потому что отключение распараллеливания исправило это для нас. В ваш тестовый проект AssemblyInfo.cs добавьте
[assembly: CollectionBehavior(DisableTestParallelization = true)]
/questions/41329562/vyipolnyat-yunit-testyi-posledovatelno-a-ne-parallelno/41329563#41329563