2016-12-21 4 views
1

У меня есть класс C# со следующим кодом.Как относительные пути в моем классе C# работают с NUnit 3.x?

class Database 
{ 
    private const string DatabaseFilepath = @"Settings\Database.xml"; 
    ... 
    private void LoadDatabase() 
    { 
     XmlDocument databaseDocument = new XmlDocument(); 
     databaseDocument.Load(DatabaseFilepath); 
    } 
} 

Теперь этот код выполняется нормально, когда я скомпилировать его, и он умеет читать из файла Database.xml. Однако, когда я запускаю единичный тест, который выполняется для выполнения этого кода с помощью NUnit, я получаю следующее исключение.

Результат Сообщение: System.IO.DirectoryNotFoundException: Не удалось найти часть пути 'C: \ Program Files (x86) \ Microsoft Visual Studio 14,0 \ Common7 \ IDE \ Settings \ Database.xml' ,

Теперь, когда я использовал инструменты для тестирования Visual Studio, это сработало отлично. Однако при переключении на NUnit он выглядит как в другом рабочем каталоге. Как я могу это изменить?

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

+0

Какая версия NUnit? От NUnit 2.x до 3.x произошло нарушение. –

+0

NUnit 3.x, извините за непонятный. Будет редактировать сообщение. – ArKi

+0

Мне показалось нелепо, что у вас есть модульные тесты для кода, который совсем не подходит для производства. Во-первых, ваш путь жестко закодирован, а тот факт, что он относительно ** pwd ** еще хуже. Если бы я запустил ваше приложение из своей домашней папки, у меня была бы такая же проблема. – MarioDS

ответ

1

В соответствии с политикой мы решили, что NUnit 3 больше не будет изменять текущий каталог при выполнении тестов, как это было в V2. С помощью V2 вы можете запустить весь список сборок в разных местах, а NUnit изменит компакт-диск на местоположение каждой сборки, прежде чем запускать его. Мы остановились, потому что:

  1. Изменение текущего каталога является недружелюбным для программы, в которой выполняются другие программы.

  2. Это не сработает, так как несколько сборок, расположенных в разных каталогах, могут одновременно работать параллельно.

Существует простое решение для тестового кода, но вы говорите, что это код в тестируемом приложении, поэтому решение немного отличается.

В краткосрочной перспективе ваши тесты могут установить компакт-диск перед запуском кода SUT, который требует, чтобы он был установлен определенным образом. Я рекомендую делать это на некотором уровне SetUp и восстанавливать его в соответствующем отрыве.

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

4

Charlie дал большое объяснение, почему они решили не менять текущий каталог. Для моего тестируемого кода я нашел, используя AppDomain.CurrentDomain.BaseDirectory и объединив его с моим относительным путем, используя Path.Combine(...), чтобы отлично работать для NUnit 3.x.