Ненужные проекты перестраиваются при модульном тестировании в Visual Studio

Я знаю о этом вопросе (и ответах), но, несмотря на все предложенные варианты, я все еще застрял.

У меня есть решение с несколькими проектами, но для этого конкретного случая позвольте сказать, что у меня есть мой ExampleProjectA и соответствующий проект unit test ExampleProjectATest. Первый добавлен в качестве ссылки на тестовый проект - не через Visual Studio "Project References", а как ссылку на DLL (что-то вроде "..\Path\$(Config)\ExampleProjectA.dll") - это связано с созданием требований к серверу в нашей компании, но проблема также существовало, когда мы все еще имели "Project References".

  • Построение, а затем запуск одного unit test отлично работает
  • Изменение только одной буквы в unit test, а затем запуск тестового запуска всегда приводит к восстановлению ExampleProjectA, хотя это не обязательно.
  • Настройка всех (было всего несколько) файлов в ExampleProjectA из "Копировать всегда" в "Копировать, если новый" в их соответствующих свойствах не помогла
  • Проверка флажка под Tools => Options => Projects and Solutions => Build an Run (см. ниже) также ничего не изменила Visual Studio 2013 setting

Чтобы узнать, есть ли какая-либо дополнительная информация, я изменил параметры вывода сборки на диагностику. Каждый раз при восстановлении ExampleProjectA, первая строка в выходных окнах

1 > Project 'ExampleProjectATest' не обновляется. Входной файл 'c:\tfs\mysolution-dev\exampleprojectatest\myfolder\namegeneratortest.cs' изменяется после выходного файла 'C:\tfs\mysolution-dev\exampleprojectatest\bin\Release\exampleprojectatest.pdb'.

Имя класса, записанное в окно (например, namegeneratortest.cs), изменяется в зависимости от того, какой файл теста я меняю.

Не знаю, почему это сообщение появляется, но следующим шагом было отключить отладочную информацию, как показано ниже в разделе Project properties => Build => Advanced => Output => Debug Info => None:

Advanced Build Settings

Тем не менее, ничего не изменилось.

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

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

Поведение аналогично (не то же самое), как с Visual Studio Test Runner, так и с предоставленным ReSharper.

Тест-драйв Visual Studio

Project 'ExampleProject' не обновляется. Входной файл 'C:\tfs\mysolution-dev\exampleprojecta\Views\Shared\someview.cshtml' изменяется после выходного файла 'C:\tfs\mysolution-dev\exampleprojecta\bin\exampleprojecta.pdb'.

ReSharper Test Runner

Project 'ExampleProjectATest' не обновляется. Входной файл 'c:\tfs\mysolution-dev\exampleprojectatest\myfolder\namegeneratortest.cs' изменяется после выходного файла 'C:\tfs\mysolution-dev\exampleprojectatest\bin\Release\exampleprojectatest.pdb'.

Я использую Visual Studio 2013 Premium Edition с ReSharper 8.2 и последние обновления, проекты в нашем файле решений находятся на С#.

Обновление

Чтобы уточнить - первая строка в окне вывода показывает, что тестовый проект нужно перестроить - это нормально. Однако следующие строки указывают, что также необходимо перестроить ExampleProjectA, что не обязательно. Последующие сообщения в окне вывода также показывают, что другие проекты (ссылки из ExampleProjectA должны быть перестроены.

Обновление 2

Несмотря на установку Update 4, ничего не изменилось.

Ответы

Ответ 1

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

Project 'xyz' is not up to date. Project item 'c:\my\path\web.config.dev' has 'Copy to Output Directory' attribute set to 'Copy always'.

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

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

Ответ 2

Проверьте, какую версию Visual Studio 2013 вы используете. У обновления 1 есть довольно большая проблема, когда он восстанавливает все. См.: https://connect.microsoft.com/VisualStudio/feedback/details/811112/unnecessary-solution-rebuild-on-each-test-run

Обновление до версии 3 сделало трюк!

Я не уверен, может ли Resharper повлиять на вещи. Я предлагаю временно удалить его.

Ответ 3

Я работал над этой проблемой, удалив файл .pdb в папке \obj. Кажется, что визуальная студия проверяет время модификации файла, чтобы решить, следует ли строить или нет проект (в вашем случае ExampleProjectA), а .cshtml является более новым, чем pdb. Но при запуске сборки изменения проекта в файлах .cshtml не запускают .pdb rebuild, поэтому проблема остается.

Удалив папку .pdb в \obj (не в \bin, поскольку файл скопирован из \obj и сохранит старое время модификации), время модификации для .pdb новее, чем .cshtml и VS не нужно строить проект перед запуском тестов. Конечно, это работает только до следующего изменения файла .cshtml, поэтому я отношусь к нему как к обходному пути.