Файл Xml не копируется для проверки выходного каталога
Машина Visual Studio 2010, x64, используя встроенный веб-сервер для размещения службы WCF с набором модульных тестов с использованием встроенной тестовой среды.
У меня есть файл XML, который мои тесты нужно загрузить для запуска. Я включил этот файл в тестовый проект и установил файл в 'content' и 'always copy to output directory'. Этот файл копирует в каталог bin\debug.
Однако при выполнении тестов файл xml отсутствует. Вместо того, чтобы искать в папке bin\debug проекта, он ищет ее в тестовом рабочем каталоге, C:\Projects\SAP Reapprovals\TestResults\name_machine 2010-12-06 13_45_43\Out ". Файл не был скопирован там.
Есть ли способ заставить этот файл копировать или мне нужно полностью квалифицировать ссылку из теста?
TIA!
Джеймс
Обновить
Я установил атрибут DeploymentItem
, но файл все равно не копируется. Но это точно похоже на то, что я хочу... любые идеи, почему это не работает?
Мой тестовый код:
[TestMethod]
[DeploymentItem("SAP - GS3 format.xml")]
public void TestProcessSapRoles() {
// I get a 'file not found' error here, and when
// I check the output directory, it isn't there
XElement rolesRoot = XElement.Load("SAP - GS3 format.xml");
}
ОТВЕТЫ:
Спасибо, пошел к CPedros, с его помощью я немного увеличил это. Я запустил монитор процессов SysInternals, чтобы посмотреть, где он ищет мой XML файл. Вот что я нашел:
Когда я запускал тесты с помощью ctrl + r, ctrl + t (тесты отладки в текущем контексте), visual studio игнорировался DeploymentItem
полностью и даже не выполнил try, чтобы скопировать файл в любом месте. В этом случае я получил исключение "Файл не найден", когда пытался его открыть для чтения. Visual studio создала временный рабочий каталог для тестов, но в нем был только один файл AgentRestart.dat.
Когда я запускал тесты, используя кнопку "Run Unit Tests" на моей панели инструментов (не уверен, какая опция теста), Visual Studio не копировала файл, а ссылалась на него непосредственно из каталога проекта. Тест прошел, и временный рабочий каталог не был создан.
Когда я запустил тест из опции меню "run → tests in current context" (запустить, а не отлаживать), был создан временный рабочий каталог, и файл xml и все исполняемые файлы были скопированы на него. Тест прошел.
Когда я редактировал Local.testsettings(в папке Solution Items в папке моих тестов), я выбрал "Развертывание" в левом меню и добавил файл xml. Он был добавлен как [каталог решений]\[каталог проекта]\file.xml. Я удалил атрибут DeploymentItem
. Теперь мне удалось отладить тесты; xml файл и все исполняемые файлы были скопированы во временный каталог, созданный для теста.
TL;DR: Visual Studio игнорирует атрибут DeploymentItem
для определенных способов запуска теста. Решение состоит в том, чтобы отредактировать Local.testsettings
, меню Deployment
и добавить файл вручную.
Спасибо за помощь! Я даю CPedros кредит за его ответ, так как это было самым полезным в разрешении этого.
Ответы
Ответ 1
Попробуйте аннотировать ваш тест атрибутом DeploymentItem: http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.deploymentitemattribute(v=VS.100).aspx
Вот фрагмент кода из документации:
[TestClass]
public class UnitTest1
{
[TestMethod()]
[DeploymentItem("testFile1.txt")]
public void ConstructorTest()
{
// Create the file to deploy
Car.CarInfo();
string file = "testFile1.txt";
// Check if the created file exists in the deployment directory
Assert.IsTrue(File.Exists(file), "deployment failed: " + file +
" did not get deployed");
}
}
Ответ 2
рассмотрите использование этого атрибута над тестами, для которых требуется XML файл:
http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.deploymentitemattribute.aspx
Ответ 3
Я уже некоторое время занимаюсь борьбой с функцией развертывания, и, наконец, просто отказался. Вместо этого я просто вручную копирую файлы в тестовый каталог, а затем удаляю их после завершения:
Местоположение тестового файла:
Private _locationOfTestFilesToBeCopied As String = "C:\...\TestFilesToBeCopied"
Private _locationOfTestFiles As String = "C:\...\TestFiles"
Инициализировать метод:
<TestInitialize()>
Public Sub Setup()
DeleteCopiedTestFiles()
CopyTestFilesToTestDirectory()
End Sub
Копировать и удалить методы:
Private Sub CopyTestFilesToTestDirectory()
Dim sourceDirectory As New DirectoryInfo(_locationOfTestFilesToBeCopied)
For Each fileInfo As FileInfo In sourceDirectory.GetFiles
fileInfo.CopyTo(_locationOfTestFiles & "\" & fileInfo.Name, True)
Next
sourceDirectory = Nothing
End Sub
Private Sub DeleteCopiedTestFiles()
Dim sourceDirectory As New DirectoryInfo(_locationOfTestFiles)
For Each fileInfo As FileInfo In sourceDirectory.GetFiles
fileInfo.Delete()
Next
sourceDirectory = Nothing
End Sub
Я нашел, что это хорошо работает
Ответ 4
Я столкнулся с проблемой, например, один из моих файлов не был скопирован в папку, даже если я ввел это имя файла в local.testSettings и установил свойство как "Копировать всегда".
Следующие шаги решили мою проблему:
- Открыть тестовое меню
- Выберите "Настройки теста"
- Выберите опцию "Выбрать файл тестовых настроек"
- Выберите файл .testsettings из окна "Открыть файл настроек"
- Убедитесь, что выбранный файл .testsettings установлен в разделе Test → Test Settings
Надеюсь, это поможет кому-то.