Проблемы с атрибутом DeploymentItem - PullRequest
92 голосов
/ 19 мая 2009

В настоящее время я поддерживаю «старую» систему, написанную на C # .net, удаляю некоторые устаревшие функции и выполняю рефакторинг. Слава богу, предыдущий парень написал несколько юнит-тестов (MSTests). Я вполне доволен тестами JUnit, но пока мало что делал с MSTests.

Методы тестирования имеют атрибут DeploymentItem, указывающий текстовый файл, который анализируется тестируемым методом бизнес-логики, и второй DeploymentItem, где указан только путь, содержащий группу файлов TIF, которые имеют быть развернутым тоже.

[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
   ...
}

Тесты работали раньше, но теперь мне пришлось изменить имена файлов TIF, содержащихся в каталоге \ files \ tif. Согласно правилу имена файлов TIF должны соответствовать определенному шаблону, который также проверяется методом ExistsTifTest(). Теперь мне пришлось изменить имена файлов, чтобы адаптировать их к новым требованиям, и внезапно файлы TIF больше не развертываются, как раньше.

Может кто-нибудь дать мне подсказку, почему это происходит или в чем причина? То же самое происходит и в том случае, если я добавляю новый текстовый файл с именем «my2ndTest.txt» рядом с «valid_entries.txt» в каталоге \ files \ valid \ с соответствующим атрибутом DeploymentItem в тестовом методе. Файл не развернут?

Я получил развернутые образы, определив путь развертывания непосредственно в testrunconfig, но я хотел бы понять, почему это происходит или почему, например, мой новый файл «my2ndTest.txt» не развертывается, в то время как другие делаем.

Ответы [ 20 ]

102 голосов
/ 19 мая 2009

DeploymentItem немного беспорядок.

Каждый файл в вашем решении будет иметь параметр «Копировать в выходную папку» в VS.NET. Вам нужно, чтобы это было «Копировать всегда» (или подобное), чтобы получить файлы в выходную папку.

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

Лично, если у меня есть файлы, которые мне нужны для моих модульных тестов, я обнаружил, что встраивание этих файлов в виде ресурсов в сборку и «распаковка» этой сборки во время тестов - более предсказуемый способ работы. YMMV.

примечание: Эти комментарии основаны на моем опыте с VS2010. Комментарии к моему ответу предполагают, что это не проблема с VS2012. Я по-прежнему придерживаюсь комментариев о том, что использование встроенных ресурсов требует меньше «магии» и, для меня, делает этап «аранжировки» моих модульных тестов гораздо более явным.

74 голосов
/ 27 июля 2010

В VS2010 у моих Local.testsettings не было флажка «Включить развертывание», а атрибут DeploymentItem не работал. Я проверил и все работало нормально. Надеюсь, это поможет!

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

Я также сталкивался с подобными проблемами, но я нашел простое 3-х шаговое решение для этого:

Предполагается, что структура вашей папки выглядит следующим образом: SolutionFolder\ TestProjectFolder\ SubFolder\

  1. Перейдите в раздел «Элементы решений / Local.testsettings»> «Развертывание»> «Включить развертывание»
  2. Если вы используете VS2010, убедитесь, что для всех файлов, которые вы хотите развернуть, их свойство «Копировать в выходную папку» имеет значение «Копировать всегда» или «Копировать, если новее»
  3. Присвойте свой TestMethod любому из:
    • [DeploymentItem(@"TestProjectFolder\SubFolder")] для развертывания всего содержимого <SubFolder> в каталоге Test Run
    • [DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")] для развертывания всего содержимого <SubFolder> в <TargetFolder> в каталоге Test Run

Последнее замечание о MSTest (по крайней мере, для VS2010):

Если вы хотите, чтобы у <TargetFolder> было то же имя, что и у <SubFolder>, использование [DeploymentItem(@"SubFolder", @"SubFolder")] завершится сбоем молча, когда бегун MSTest попадет в случай с глупой гранью. Вот почему вы должны префикс <SubFolder> с <TestProjectFolder> следующим образом: [DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]

14 голосов
/ 24 января 2012

Мы надеемся помочь кому-то еще: я попробовал все предложения здесь, и все еще мой элемент развертывания не копировался.

Что мне нужно было сделать (, как предложено здесь ), это добавить второй параметр в атрибут DeploymentItem:

[DeploymentItem(@"UnitTestData\TestData.xml", "UnitTestData")]
10 голосов
/ 19 марта 2010

Если вы войдете в файл .testrunconfig и при развертывании снимите флажок «Включить развертывание», тесты будут выполняться в обычном месте, и все будет работать так же, как и при запуске приложения вне модульного теста.

8 голосов
/ 19 июля 2011

Вероятно, это не относится к вашей конкретной проблеме, но вот пара советов, которые я нашел с атрибутом [DeploymentItem].

  1. Для параметра Копировать в выходной каталог должно быть установлено значение Всегда копировать.

Работает НЕ при использовании с атрибутом [TestInitialize]

[TestInitialize]
[DeploymentItem("test.xlsx")]
public void Setup()
{

Он должен быть на вашем [TestMethod], например

    [TestInitialize]
    public void Setup()
    {
        string spreadsheet = Path.GetFullPath("test.xlsx");
        Assert.IsTrue(File.Exists(spreadsheet));
        ...
    }

    [TestMethod]
    [DeploymentItem("test.xlsx")]
    public void ExcelQuestionParser_Reads_XmlElements()
    {
        ...
    }
5 голосов
/ 16 ноября 2012

Перепробовав все остальные предложения, перечисленные здесь, я так и не смог понять, что происходит. Наконец, я обнаружил, что в меню Test / Test Settings не было выбрано ни одного файла настроек, что означало, что Deployment не было включено. Я щелкнул пункт меню «Тест / Настройки теста / Выбрать файл настроек теста», выбрал файл Local.TestSettings и все заработало.

4 голосов
/ 23 июля 2012

Не уверен, что это точно отвечает на вопрос, но это может помочь некоторым. Во-первых, я обнаружил, что флажок «Включить развертывание» должен быть установлен, чтобы развертывание работало. Во-вторых, в документе говорится, что исходный путь «относительно пути проекта», который я сначала обозначил как папку проекта. На самом деле, похоже, это относится к выходной папке сборки. Поэтому, если у меня есть папка проекта с именем «TestFiles» и файл с именем Testdata.xml, использование атрибута таким способом не работает:

[DeploymentItem(@"TestFiles\Testdata.xml")] 

Я могу пометить файл Testdata.xml Copy Always, чтобы сборка помещала копию в выходную папку (например, Debug\TestFiles\TestData.xml). Затем механизм развертывания найдет копию файла, расположенную по этому пути (TestFiles\Testdata.xml) относительно выходных данных сборки. Или я могу установить атрибут следующим образом:

[DeploymentItem(@"..\\..\TestFiles\Testdata.xml")] 

и механизм развертывания найдет исходный файл. Так что либо работает, но я заметил, что при использовании Copy Always я иногда сталкиваюсь с той же проблемой, с которой сталкиваюсь при редактировании файла app.config в проекте - если я не изменяю код или не выполняю принудительную перестройку, ничто не вызывает копирования файлы, помеченные для копирования при сборке.

3 голосов
/ 15 сентября 2011

Сначала у меня был отключен флаг развертывания. Но даже после того, как я включил его, по какой-то неизвестной причине ничего, даже целевые библиотеки DLL все равно не будут скопированы. Случайно я открыл окно Test Run и убил все предыдущие прогоны, и волшебным образом нашел все DLL и файлы, которые мне нужны, в папке test при следующем запуске ... Очень запутанно.

2 голосов
/ 11 января 2013

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

Тогда я закрыл VS2010; перезапустил его, загрузил решение и все заработало. (!)

Я сделал некоторую проверку; После установки флажка «Включить развертывание» на local.TestSetting вам не нужно просто повторно запускать тест из окна «Результаты теста». Вы должны удалить предыдущий тестовый прогон из пользовательского интерфейса, например запустив другой тест или повторно открыв решение.

...