Как сделать, чтобы файл конфигурации копировался в каталог с результатами теста при модульном тестировании? - PullRequest
4 голосов
/ 13 марта 2011

Я написал несколько модульных тестов, которые зависят от файла конфигурации.Этот file.config развертывается в каталоге bin\Debug моего тестового проекта.Однако, похоже, что он не копируется в мой каталог с результатами выходного теста, в котором фактически выполняется тест.

Я искал и обнаружил следующее:
TFS UnitTesting не развертывает сборку локальной копии вdir test, когда на сервере сборки
Тестовый проект и файл конфигурации

Первая ссылка позволила мне узнать, как развернуть файл конфигурации в моем тестовом проекте bin\Debugкаталог.

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

РЕДАКТИРОВАТЬ # 1

Я использую:

  1. Microsoft Enterprise Library 4.1 вместе с именованными соединениями;с
  2. Microsoft Visual Studio 2008;и
  3. Microsoft UnitTest Framework.

Мой файл конфигурации выглядит следующим образом:

<configuration>
  <configSections>
    <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </configSections>
  <dataConfiguration defaultDatabase="Tests" />
  <connectionStrings>
    <add name="Tests" connectionString="Database=Tests;Server=(local)\SQLEXPRESS;Integrated Security=SSPI"
        providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

и имеет имя: Tests.config.

Теперь у меня есть настройки проекта, которые содержат параметр DefaultSource, который содержит имя источника по умолчанию, то есть, для которого создаются соединения и объекты баз данных.Значение этого параметра: Tests.

Итак, когда я создаю новое соединение, я просто делаю это так:

public static IDbConnection CreateConnection(string source) {
    return new DatabaseProviderFactory(new FileConfigurationSource(
            string.Format("{0}\{1}.config", AppDomain.CurrentDomain.BaseDirectory, source)
        ).CreateDefault().CreateConnection();
}

Теперь, это то, что не работает должным образомво время модульного тестирования, из-за значения AppDomain.CurrentDomain.Basedirectory, которое возвращается.Поскольку это свойство не возвращает каталог сборки сборки bin\Debug, а скорее TestResults[auto-generated-test-results-directory], где на самом деле выполняются тесты.

Итак, когда в моем тесте я делаю:

[TestMethod()]
public void Connection_InitializationWithSourceName() {
    using connection as IConnection = ConnectionProviderFactory.CreateConnection(DefaultSource) {
        // Asserts here... 
    } 
}

свойство DefaultSource вернет мой параметр настройки источника по умолчанию, значение которого Tests.Итак, объектный класс FileConfigurationSource будет искать файл с именем Tests.config в каталоге результатов теста, в котором фактически выполняются тесты, как указано ранее.

Есть идеи, как это сделать?

Спасибо!=) * +1063 *

Ответы [ 2 ]

5 голосов
/ 13 марта 2011

Почему бы вам просто не добавить событие postbuild в ваш проект, который скопирует файл куда угодно?

4 голосов
/ 18 января 2012

Вы можете добавить атрибут [DeploymentItem] во все тесты, которые в нем нуждаются, и это позволит развернуть все нужные вам файлы в папке out.http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.deploymentitemattribute(v=vs.80).aspx

Может использоваться следующим образом:

[DeploymentItem("resources/my-file.ini")]
[TestMethod()]
public void Connection_InitializationWithSourceName() {

Или вы можете поместить его в класс, если он вам нужен для всех тестов в этом классе.

...