2009-10-08 4 views
22

Целью является выполнение некоторых тестов с учетом некоторых данных в этих файлах Xml.Visual Studio - модульные тесты загружают ресурсы в проект

Как бы вы могли легко загрузить данный Xml-файл в XmlDoc в рамках единичных тестовых методов?

Текущее состояние:

XmlDocument doc = new XmlDocument(); 
    string xmlFile = "4.xml"; 
    string dir = System.IO.Directory.GetCurrentDirectory() + @"\Msgs\" 

    //dir is then the value of the current exe's path, which is 
    //d:\sourcecode\myproject\TestResults\myComputer 2009-10-08 16_07_45\Out 

    //we actually need: 
    //d:\sourcecode\myproject\Msgs\ 
    doc.Load(dir + fileName); //should really use System.IO.Path.Combine()! 

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

Вопрос: Как вы напишете алгоритм для загрузки данного Xml-файла в XmlDocument в методе единичных тестов?

ответ

9

В модульном тестовом проекте добавьте событие после сборки, которое копирует XML-файл в выходной каталог. Затем вы можете использовать свой исходный код для получения XML-файла.

Сообщение событие сборки будет выглядеть как-то вроде этого:

copy $(SolutionDir)file.xml $(ProjectDir)$(OutDir)file.xml 

Вам также может понадобиться, чтобы добавить в свой путь:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) 
+14

Я обнаружил, что мой файл собирается «Project1_UnitTests \ bin \ Debug», тогда как тест пытается найти его под «TestResults \ Username_PCName_datetime \ Out» .. ??? – Greg

+0

за 6 upvotes в комментарии @ Greg, я отредактировал этот ответ и добавил дополнительную информацию, чтобы сделать этот ответ более полным. – javamonkey79

+1

@ javamonkey79 Это не помогает java –

0

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

Например, все разработчики в моей команде должны использовать C: \ Project \ Product \ Module и т. Д. И т. Д. Также я уверен, что все их программное обеспечение также является стандартным. Таким образом, я могу легко придумать любую машину.

22

Вы можете скомпилировать эти файлы в свой исполняемый файл (установить их свойство «Build Action» на «Embedded Resource»), а затем получить их с помощью Assembly.GetManifestResourceStream method.

+0

У Патрика Коулдуэля есть интересная статья об этом [http://www.cauldwell.net/patrick/blog/TestingWithExternalFiles.aspx](http://www.cauldwell.net/patrick/blog/TestingWithExternalFiles.aspx) –

4

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

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Brass9.Testing 
{ 
    public static class TestHelper 
    { 
     public static string GetBinPath() 
     { 
      return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
     } 

     public static string GetProjectPath() 
     { 
      string appRoot = GetBinPath(); 
      var dir = new DirectoryInfo(appRoot).Parent.Parent.Parent; 
      var name = dir.Name; 
      return dir.FullName + @"\" + name + @"\"; 
     } 

     public static string GetTestProjectPath() 
     { 
      string appRoot = GetBinPath(); 
      var dir = new DirectoryInfo(appRoot).Parent.Parent; 
      return dir.FullName + @"\"; 
     } 

     public static string GetMainProjectPath() 
     { 
      string testProjectPath = GetTestProjectPath(); 
      // Just hope it ends in the standard .Tests, lop it off, done. 
      string path = testProjectPath.Substring(0, testProjectPath.Length - 7) + @"\"; 
      return path; 
     } 
    } 
} 

Иногда мое взаимодействие с путями более сложное; Я часто использую центральный класс, который я называю «App», чтобы указать некоторые основные сведения о приложении, такие как его корневая папка, его корневое пространство имен и модуль и т. Д. Классы будут иногда зависеть от существования App, поэтому вместо этого я поставлю init метод в приложении, который использует такой код, как указано выше, для инициализации для тестовых жгутов и вызова этого метода из команды Init в модульном тесте.

(Обновлено)

Старый Ответ

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

DirectoryInfo projectDir = new DirectoryInfo(@"..\..\..\ProjectName"); 
string projectDirPath = projectDir.FullName; 

Затем вы можете использовать любую из этих переменных для доступа к тому, что вам нужно от соответствующего проекта. Очевидно, замените «ProjectName» на фактическое название вашего проекта.

+0

Или, если ваш путь выглядит так: «TestResults \ Username_PCName_datetime \ Out», вы можете использовать 'ProjectDir = new System.IO.DirectoryInfo (@" .. \ .. \ .. \ .. \ .. \ .. \ ProjectName ");' –

+0

У меня возникли проблемы с использованием этого метода. Один путь будет работать для MS Test runner, но для других участников он может не работать.Например, некоторые разработчики использовали ** MS Test Runner ** и некоторые ** ReSharper **, а тестовые пути были разными (\ TestResults \\) и не удались одним или другим способом. Исправлено взломом:/ –

24

Существует визуал особенность студии модульного тестирования для этого: DeploymentItemAttribute

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

Этот атрибут можно использовать с модульными тестами для копирования определенных файлов из папки «Проект» (или в другое место) в выходную папку «Тестирование теста». Как так:

[TestMethod()] 
[DeploymentItem("MyProjectFolder\\SomeDataFolder\\somefile.txt", "SomeOutputSubdirectory")] 
public void FindResourcefile_Test() 
{ 
    string fileName = "SomeOutputSubdirectory\\somefile.txt"; 
    Assert.IsTrue(System.IO.File.Exists(fileName)); 
} 

Вы также можете скопировать содержимое целых папок:

[TestMethod()] 
[DeploymentItem("MyProjectFolder\\SomeDataFolder\\", "SomeOutputSubdirectory")] 
public void FindResourcefile_Test() 
{ 
    string fileName = "SomeOutputSubdirectory\\someOtherFile.txt"; 
    Assert.IsTrue(System.IO.File.Exists(fileName)); 
} 

Первый параметр является источником, то вторая папка назначения. Источник относится к папке с вашим решением (так что вы можете получить доступ к проекту Unit Test тестируемого проекта), а пункт назначения относится к выходной папке сборки модуля.

UPDATE:

Вам необходимо включить развертывание в настройках теста для этой работы. На этой странице MSDN объясняется, как (это очень просто): http://msdn.microsoft.com/en-us/library/ms182475(v=vs.90).aspx#EnableDisableDeploy

+0

Это не работает с ** NUnit **. 'DeploymentItemAttribute' находится в' Microsoft.VisualStudio.TestTools.UnitTesting' – Jess

+0

Обратите внимание, что вы должны установить свойство «copy to output» файла, который хотите использовать: выберите их в обозревателе решений и установите для свойства «Копировать в вывод» значение «Копировать», если Новее. См. Эту ссылку: https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.deploymentitemattribute(v=vs.140).aspx – Allie

0

Я думаю, что в VS.NET 2012 атрибут DeploymentItem работает без какой-либо конфигурации тестовых настроек.

1

Ресурсы - это всего лишь ресурсы, и все, не нужно усложнять. Если вы не хотите их внедрять, вы можете добавить эти файлы в качестве ресурсов «Контент» в свой проект и установить их на Copy always. Затем указать вложенную папку в вашем коде:

var xmlDoc = XElement.Load("ProjectSubFolder\\Resource.xml"); 

Это будет автоматически загружать ресурсы с выхода проекта (работает местоположение сборки) bin\$(Configuration)\ResourceSubfolder\

Это работает для всех типов проектов, а не только модульных тестов.

Смежные вопросы