Конфликт версий сборки для AutoFixture и Moq с NUnit в TeamCity 7

Раньше у меня были все модульные тесты для моего решения, содержащиеся в одной библиотеке, и недавно они были разделены. При размещении в одной сборке все тесты проходят как локально, так и в TeamCity, но при разделении возникают конфликты версий.

Конфигурация:

  • Team City 7.1.5 (сборка 24400)
  • Автофиксация 3.20.2
  • AutoFixture.AutoMoq 3.20.2
  • Moq 4.2.1402.2112
  • NUnit 2.6.3

У меня есть несколько сборок модульных тестов, все из которых ссылаются на базовую тестовую библиотеку. Все тестовые сборки используют перечисленные выше пакеты NuGet.

При запуске тестов на машине разработчика (VS 2015) все тесты проходят успешно.

При запуске построения командного города выдается следующая ошибка:

System.IO.FileLoadException: не удалось загрузить файл или сборку Moq, Version = 4.1.1308.2120, Culture = нейтральный, PublicKeyToken = 69f491c39445e920 или одну из его зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040) в Ploeh.AutoFixture.AutoMoq.MockPostprocessor.Create (запрос объекта, контекст ISpecimenContext)

В моем решении нет ссылки на Moq 4.1.1308.2120, поэтому я знаю, что это должна быть ссылка из AutoFixture.

Обновление AutoFixture до 3.31.3 не имеет значения.

У меня есть следующее перенаправление привязки в файлах app.config всех тестовых сборок:

<dependentAssembly>
  <assemblyIdentity name="Moq" publicKeyToken="69f491c39445e920" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.2.1402.2112" newVersion="4.2.1402.2112" />
</dependentAssembly>

Я не могу понизить свою версию Moq до 4.1.1308.2120, поскольку я использую функции 4.2 в своих тестах.

Мне кажется, что Team City игнорирует перенаправления. Я понятия не имею, почему, и, попробовав каждую комбинацию версий для этих сборок, я не могу заставить Team City успешно запустить тесты.


person Rob King    schedule 19.08.2015    source источник
comment
Как Team City проводит тесты? Какой тестовый раннер он использует?   -  person Mark Seemann    schedule 19.08.2015
comment
Можете ли вы воспроизвести проблему, если используете тот же инструмент запуска тестов на машине разработки?   -  person Mark Seemann    schedule 19.08.2015
comment
Я только что попробовал это сейчас, все тесты прошли успешно: /   -  person Rob King    schedule 19.08.2015
comment
Может быть, эта старая версия Moq прячется в GAC на машине разработки? Я рекомендую использовать Fuslogvw, чтобы увидеть, откуда он загружается локально, а затем вы можете попробовать его снова на машине TeamCity, чтобы увидеть, делает ли он то же самое.   -  person Nanhydrin    schedule 20.08.2015
comment
Если у меня есть AutoFixture.AutoMoq 3.20.1 и AutoFixture 3.20.2, я получаю ту же ошибку, но для AutoFixture 3.20.1. Это убедительно свидетельствует о том, что TeamCity игнорирует перенаправления привязки.   -  person Rob King    schedule 20.08.2015
comment
Вам удалось найти решение этой проблемы? Если нет, можете ли вы опубликовать в Интернете образец решения, в котором используются именно те версии Dll, и я могу попробовать его при установке TC?   -  person Ruskin    schedule 09.01.2016
comment
Можно ли его воспроизвести после чистой сборки? Я имею в виду проверку очистки всех файлов в каталоге проверки перед установкой флажка сборки в настраиваемом диалоговом окне «Выполнить».   -  person Boris Modylevsky    schedule 21.06.2016
comment
Возможно, у вас грязный кеш nuget в teamcity stackoverflow.com/questions/17697385 /. Попробуйте очистить его или обойти его при установке пакетов.   -  person 8DH    schedule 30.08.2016


Ответы (2)


Я был смущен, когда обнаружил причину, по которой я видел эту ошибку.

После 8-часовой отладки я обнаружил, что ссылался на TestProjectB в TestProjectA. Teamcity был настроен для запуска любого xunit с любой найденной Test * .dll. Итак, он нашел TestProjectB.dll в папке TestProjectA / bin / Debug.

Но нет TestProjectB.dll.config для TestProjectB.dll, когда он находится в / TestProjectA / bin / Debug. Следовательно, никакая привязка / перенаправление сборки не задано.

Я удалил ссылку на проект, потому что она была ненужной, и обновил мой бегун teamcity xunit, чтобы исключить библиотеки DLL, у которых нет подходящей конфигурации.

person Rhys    schedule 09.08.2017

Мы тоже столкнулись с этой проблемой. Мы запустили сборку Fusion Logs на нашем сервере сборки и увидели это в журналах ошибок:

    Calling assembly : Ploeh.AutoFixture.AutoMoq, Version=3.50.2.0, Culture=neutral, PublicKeyToken=b24654c590009d4f.
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Moq, Version=4.1.1308.2120, Culture=neutral, PublicKeyToken=69f491c39445e920
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///D:/builds/13/s/AssessmentMigratorService.IntegrationPostbuild/bin/Debug/Moq.DLL.
LOG: Assembly download was successful. Attempting setup of file: D:\builds\13\s\AssessmentMigratorService.IntegrationPostbuild\bin\Debug\Moq.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Moq, Version=4.5.28.0, Culture=neutral, PublicKeyToken=69f491c39445e920
WRN: Comparing the assembly name resulted in the mismatch: Minor Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated

Итак, если вы видите эту часть

Файл конфигурации приложения не найден.

я думаю, что происходит то, что хост-приложение запуска модульных тестов на сервере сборки не видит файл конфигурации приложения, и поэтому перенаправления привязки сборки не могут применяться, поскольку они находятся в app.config.

Итак, я вижу 3 возможных решения / обходных пути, если вам нужно использовать эти сборки:

  1. Выясните, почему средство запуска модульных тестов TeamCity на сервере сборки не может найти файл конфигурации приложения и исправить это.
  2. Используйте другую программу запуска модульных тестов на сервере сборки.
  3. Добавьте перенаправления привязки в файл machine.config сервера сборки. Это будет применяться глобально ко всему компьютеру, поэтому на этом этапе нет необходимости в перенаправлениях в файле конфигурации приложения.
person Dan Csharpster    schedule 30.11.2016