Как обратиться к тестовым файлам из тестов Xunit в Visual Studio?
Использовали Xunit для тестирования. Выполняли наши тесты через встроенный тестовый Runner для Visual Studio 2013, используя плагин Xunit.
Проблема в том, что некоторые из тестов должны ссылаться на файлы в файловой системе. Кажется, что Xunit (или VS Runner Runner - не уверен, что), копирует сборки, но не поддерживает файлы поддержки в каталоге bin, в другой каталог перед выполнением тестов, поэтому наши тестовые файлы не найдены. [Структура MS Testing указывает атрибуты для копирования файлов, которые будут скопированы, но Xunit не делает.]
Как отключить это поведение копирования или программно определить исходное расположение каталога bin/
для извлечения файлов?
Похоже, что большинство предлагаемых решений (в том числе на сайте Xunit bug-tracker) предлагают хранить файлы в виде встроенных ресурсов вместо "копировать всегда файлы". Однако это не всегда практично, например: проверка кода манипулирования файлами и (в одном случае) код, который хочет получить файл базы данных Sqlite.
Ответы
Ответ 1
Хорошо, типично, как только я отправляю вопрос, я сам нахожу ответ...
Суть в том, что копирование (теневое копирование) сборок, по-видимому, выполняется с помощью платформы .NET, а не с помощью Visual Studio или Xunit.
Мы использовали Assembly.Location
для поиска файла сборки и, следовательно, тестовых файлов. Однако это было неправильно, так как это дало нам местоположение сборников с теней, скопированных вместо оригиналов.
Вместо этого вы должны использовать Assembly.CodeBase
для выбора местоположения кода базовой сборки. Однако это URL-адрес (File), поэтому его необходимо извлечь из URL-адреса. Новый (С#) код выглядит следующим образом:
var codeBaseUrl = new Uri(Assembly.GetExecutingAssembly().CodeBase);
var codeBasePath = Uri.UnescapeDataString(codeBaseUrl.AbsolutePath);
var dirPath = Path.GetDirectoryName(codeBasePath);
return Path.Combine(dirPath, relativePath);
... где relativePath
- путь к каталогу Bin\
.
Ответ 2
Я запускаю .Net Core 1.0 на Mac. Assembly.GetExecutingAssembly
недоступен. Вместо этого я использую следующий код:
var location = typeof(YourClassName).GetTypeInfo().Assembly.Location;
var dirPath = Path.GetDirectoryName(location);
return Path.Combine(dirPath, relativePath);
relativePath
- это путь к каталогу вашей DLL.
Ответ 3
После небольшого поиска я нашел решение здесь: https://msdn.microsoft.com/en-us/library/ms182475.aspx.
В частности, для меня было достаточно первого шага:
Если они специфичны для одного тестового проекта, включите их в качестве файлов содержимого в тестовый проект Visual Studio. Выберите их в Обозревателе решений и установите для свойства "Копировать в вывод" значение "Копировать", если "Создать".
связанный с следующим кодом:
var filename = "./Resources/fake.pdf"
File.OpenRead(filename)
![Cfg файлов в папке ресурсов]()