Написание модульных тестов: Как программно получить папку с тестовыми файлами - PullRequest
20 голосов
/ 24 декабря 2010

Я пишу юнит-тесты в Visual Studio 2010.
Для проверки некоторых функций я добавил папку с testfiles.
Мне нужно получить эту папку программно, без жесткого пути в строке.

Папка содержит <projectDirectory>/TestFiles

Я пытался использовать AppDomain.CurrentDomain.BaseDirectory.Это будет работать только в том случае, если я запускаю свои модульные тесты с помощью resharper.
результат равен <projectDirectory>/bin/debug, поэтому я могу легко перейти к TestFiles.

Если я запускаю тест с Visual Studio, BaseDirectory:
<sameFolderAsSolutionFile>\TestResults\<username>_<pcname> <datatime>\Out

Я переместил файл решения в другую папку.Таким образом, мои проекты не находятся в той же папке, что и файл моего решения.
Пример:
<sameFolderAsSolutionFile> = C:\SolutionFiles
<projectDirectory> = C:\Projects\MyProject

Может кто-нибудь сказать мне, как получить путь к моему тесту-файлы без использования жестко запрограммированной строки?

РЕДАКТИРОВАТЬ
Я пока не нашел решения.
Visual Studio использует другую папку сборки для тестирования.Таким образом, все, что обычно встроено в папку bin, будет встроено в другую папку для теста.

МОЕ TEMP-РЕШЕНИЕ
Я добавил файл App.config в свой тестпроект.В этом файле конфигурации я добавил параметр с требуемым путем к тестовым файлам:

<appSettings>
  <add key="TestFiles" value="C:\Projects\MyProject\TestFiles"/>
</appSettings>

Ответы [ 6 ]

21 голосов
/ 12 января 2011

Вы можете скопировать эту папку в папку развертывания модульных тестов с атрибутом DeploymentItem .

11 голосов
/ 16 мая 2013

Даже на вопрос уже дан ответ, я хочу помочь с решением, которое сработало для меня, как и другие.Вам нужно будет скопировать файл в каталог bin тестового проекта, отметив его в его свойствах. Копировать в ouput directory = "Копировать всегда", тогда в тесте вы можете прочитать файл с таким кодом:

var baseDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var testFile = Path.Combine(baseDir, "TestFiles", "file.txt");

var file = File.OpenRead(testFile))
11 голосов
/ 01 февраля 2011

Самый надежный способ - использовать TestContext.Этот объект имеет множество свойств для пути развертывания, пути к результатам и т. Д. См. Свойства TestContext .

4 голосов
/ 11 января 2011

Вы можете использовать Path.Combine(Assembly.GetExecutingAssembly().Location,"TestFiles"), чтобы попасть в эту папку без жесткого кодирования.Вы должны убедиться, что вы добавили папку и файлы в ваш тестовый проект и правильно установили его каталог CopyToOutput.

2 голосов
/ 24 декабря 2010

Мы делаем это так:

var assembly = Assembly.GetAssembly(this.GetType());
var codebase = assembly.CodeBase.Replace("file:///", "");
var baseDir = Path.GetDirectoryName(codebase);

Этот фрагмент кода C # взят из процедуры настройки модульного теста и получает каталог кода модульного теста. Отсюда вы можете перемещаться ... Я не думаю, что это очень элегантно ... но:)

1 голос
/ 29 августа 2013

В случае, если придет кто-то вроде меня, если вы используете .testsettings файл и атрибут DeploymentItem в классе , не работает дажехотя вы установили свои файлы как Content и Always Copy, это потому, что либо у вас уже есть раздел Deployment в вашем файле .testsettings, либо вам нужно использовать DeploymentItem в файле .testsettings.Вот как выглядит наш:

<Deployment>
    <DeploymentItem filename="Tests\Unit Tests\ConnectionStrings.config" />
    <DeploymentItem filename="Tests\Unit Tests\<project dir>\bin\Debug\TestFiles\" outputDirectory="TestFiles" />
</Deployment>

Один делает файл, другой делает 13 файлов в каталоге.Обратите внимание на косую черту для имени файла каталога!

Решение и дополнительная информация были найдены по адресу:

MsTest DeploymentItem OutputDirectory в testsettings

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...