C # Directory.GetCurrentDirectory (), возвращающий system32 с помощью NUnit - PullRequest
0 голосов
/ 11 сентября 2018

Я использую сторонний пакет Nuget для кукловода.Я не могу заставить работать любой код с этой библиотекой.Я посмотрел код и обнаружил следующую строку кода

DownloadsFolder = Path.Combine(Directory.GetCurrentDirectory(), ".local-chromium");

Проблема заключается в том, что при запуске модульного теста Directory.GetCurrentDirectory() возвращает Windows/system32, и код завершается ошибкой, поскольку у него нет разрешения нанаписать в этот каталог.

Казалось бы, это предполагаемое поведение https://github.com/nunit/nunit/issues/1768.Проблема здесь в том, что я не могу изменить исходный код этой DLL, поэтому я застрял.Есть ли способ изменить nunit, чтобы он возвращал каталог, который я могу определить для Directory.GetCurrentDirectory()?

1 Ответ

0 голосов
/ 11 сентября 2018

Если я правильно понимаю, код, который вызывает Directory.GetCurrentDirectory, находится в библиотеке, используемой приложением, которое вы тестируете. (Если бы это было в ваших собственных тестах NUnit, то этот ответ должен был бы быть другим.) Это неверный выбор дизайна для кода библиотеки, поскольку предполагается, что приложение, вызывающее библиотеку, установило (или оставило) текущий каталог в подходящее место. (ИМО, это нормально для приложения, но не для библиотеки.)

Я предполагаю, что вы работаете в Visual Studio, поскольку текущим каталогом является System32.

По своей сути, NUnit никогда не изменяет текущий каталог, поэтому он остается таким же, каким он был при первом запуске программы. Вы можете изменить это в своих тестах, но при этом есть риски.

Это объясняет, почему вы видите проблему. Вот обходной путь.

  1. Если вам все равно (для целей тестирования), где находится папка, создайте временную папку в настройках теста и удалите ее в разборке. Это можно сделать для каждого теста (SetUp и TearDown) или для всего прибора (OneTimeSetUp и OneTimeTearDown).

  2. В том же месте установки установите текущий каталог в эту временную папку, сохранив исходный текущий каталог. Восстановите его соответствующим способом разрыва.

  3. Убедитесь, что никакие тесты с использованием каталога не могут выполняться параллельно. Если вы вообще не используете ParallelizableAttribute, все будет в порядке. Но если вы установили какое-либо значение на сборке или другом более высоком уровне, пометьте классы, содержащие эти тесты, как [NonParallelizable].

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

...