Как обратиться к тестовым файлам из тестов 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)

Проект тестирования (обратите внимание на папку Resource) Cfg файлов в папке ресурсов