Почему MSTest DeploymentItem не работает при выполнении всех тестов в решении?

У меня есть решение Visual Studio 2010 с несколькими проектами MSTest. Один из тестовых проектов нуждается в файле в определенном каталоге для запуска.

[TestClass]
[DeploymentItem("ReportEngine.config")]
[DeploymentItem("Report Files", "Report Files")]
public class MyReportTests { }

Эти тесты проходят, когда я запускаю только тесты в этом проекте (или тестовом классе). Файлы отчета копируются в каталог выполнения теста. Эти тесты терпят неудачу, когда я запускаю все тесты в решении. Файлы отчетов не копируются в каталог выполнения теста.

Почему существует разница, и как сделать два запуска разворачивать одни и те же элементы?

Ответ 1

Кажется, проблема с исправлением в Microsoft не удалась.

Ответ 2

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

Убедитесь, что для пробного запуска установлено развертывание.

  • Отредактируйте .testsettings в папке Solution Items
  • Выберите категорию развертывания
  • Установите флажок "Включить развертывание"
  • Нажмите "Применить" и "Закрыть"

Однако, поскольку в прошлый раз я ответил, я узнал, что атрибут DeploymentItem предназначен только для методов (а затем, похоже, работает только на TestMethod s). Он никогда бы не работал так, как вы его украшаете class. Я также заметил ваш комментарий к вашему вопросу (отредактирован для грамматики)

Да, элементы имеют значение Copy Always, в противном случае DeploymentItem в прогоне тестирования проекта не будет работать.

Там много обсуждения, нужно ли это или нет, чтобы сделать работу DeploymentItem. Я подозреваю, что что-то, что мы еще не определили, проходит тестирование при запуске их из проекта. Удалите DeploymentItem полностью и попробуйте выполнить два тестовых прогона (из проекта и из решения) и посмотрите, какие результаты вы получите.


В случаях развертывания элементы работают, несмотря на документацию

Убедитесь, что ReportEngine.config и ReportFiles\ находятся там, где вы и MSTest ожидаете их. Относительные пути к файлам разрешаются, начиная с "RelativeRootPath". По умолчанию, это $(SolutionDir). Если вы не отмените его в testsettings. Пожалуйста, проверьте это.

Но по умолчанию

[DeploymentItem("ReportEngine.config")]

расширяется до значения

[DeploymentItem("$(SolutionDir)\ReportEngine.config")]

то, например, на

[DeploymentItem("D:\code\my-project\ReportEngine.config")]

Ответ 3

Элементы развертывания, как известно, ошибочны... Рассматривали ли вы использование MSBuild и редактирование файла тестового проекта .csproj напрямую?

<Target Name="AfterBuild">
  <CallTarget Targets="DeployReportFiles" />
</Target>

<Target Name="DeployReportFiles">
  <CreateItem Include="$(SolutionDir)\Report Files\**\*">
    <Output TaskParameter="Include" ItemName="OutputFiles" />
  </CreateItem>
  <Copy SourceFiles="@(OutputFiles)"
        DestinationFiles="@(OutputFiles->'$(???)\Report Files\%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>

Я не знаю, содержит ли MSBuild переменную для текущей тестовой директории... поскольку она не участвует в процессе.