Visual Studio - модульные тесты загрузки ресурсов в проект - PullRequest
22 голосов
/ 09 октября 2009

Цель состоит в том, чтобы запустить некоторые тесты с данными в этих XML-файлах.

Как бы вы легко загрузили данный файл 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 в методе модульного теста?

Ответы [ 7 ]

24 голосов
/ 25 июля 2012

Для этого есть функция модульного тестирования Visual Studio: DeploymentItemAttribute

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

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

[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));
}

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

UPDATE:

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

23 голосов
/ 09 октября 2009

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

10 голосов
/ 09 октября 2009

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

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

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

Вам также может понадобиться добавить это к вашему пути:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
4 голосов
/ 30 марта 2011

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

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;
        }
    }
}

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

(обновлено)

Старый ответ

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

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

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

1 голос
/ 10 апреля 2014

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

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

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

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

0 голосов
/ 27 августа 2013

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

0 голосов
/ 09 октября 2009

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

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

...