Ненужные проекты перестраиваются при модульном тестировании в 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, поэтому я отношусь к нему как к обходному пути.