четверг, 18 июня 2015 г.

NUnit: Тестирование DLL, использующей внешние данные

В составе одной из моих DLL присутствует функционал, позволяющий проверять на предмет корректности выражения вида ACAD-E001:409 (а так же создавать их) и, если выражение корректно, то полностью расшифровывать эту информацию. Для работы обозначенной DLL необходим специальный XML файл, содержащий информацию о существующих версиях AutoCAD и их вертикальных продуктах. Этот файл размещается в том же каталоге, в котором находится DLL. Для тестирования обозначенного функционала я написал пару тестов и запустил их в GUI NUnit...


Код моей DLL находит нужный XML следующим образом:

String asmLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly(
  ).Location);

// xml file with AutoCAD products data.
String xmlFile = Path.Combine(asmLocation, "cad.data.xml");
if (!File.Exists(xmlFile)) {
  throw new FileNotFoundException(xmlFile);
}

Результаты компиляции размещены в каталоге "C:\Users\developer\Documents\Visual Studio 2013\Projects\cad-solution\cad.UnitTests\bin\Debug". Запустив тесты на исполнение я увидел, что все они с треском провалились:


В правом верхнем текстбоксе читаю сгенерированное моим кодом сообщение об ошибке:

Bushman.CAD.UnitTests.Tests.LocalizedProduct_TryParse_Check_BoolValue(null,False):
System.TypeInitializationException : Инициализатор типа "Bushman.CAD.LocalizedProduct" выдал исключение.
  ----> System.IO.FileNotFoundException : C:\Users\developer\AppData\Local\Temp\nunit20\ShadowCopyCache\5128_635702471073123992\Tests_27930185\assembly\dl3\7e84bc6f\b85de2a2_d6a9d001\cad.data.xml

Я подсветил красным цветом ключевую информацию. Это исключение происходит потому, что NUnit копирует тестируемую DLL в произвольно сгенерированный каталог и уже оттуда загружает её и запускает присутствующие в ней тесты. Но скопировав DLL, NUnit не сделал того же самого и для моего XML файла, в виду чего и происходит обозначенное исключение. Обозначенное поведение в NUnit называется Shadow Copy (Теневое Копирование).

Shadow Copy можно включать или отключать в настройках NUnit: меню Tools -> Settings... -> Test Loader -> Advanced -> Shadow Copy -> Enable Shadow Copy:


Обратите внимание на информацию, которую я выделил красным цветом.

Если обозначенную галочку снять, то после перезапуска NUnit теневое копирование не происходит и DLL загружается из того каталога, где она изначально находилась. Соответственно успешно находится и XML файл:




Комментариев нет: