#c# #unit-testing #file #testing #xunit
Вопрос:
Я хотел написать модульные тесты для всех файлов по определенному пути. Например, первый запуск будет для файла x, второй-для файла y и т. Д.
Но у меня есть проблема с преобразованием IEnumerable<string>
в IEnumerable<object[]>
:
public static IEnumerable<object[]> ExpectedOutputFiles;
public JsonParserTests()
{
var files = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, GetOutputDataFolder()));
ExpectedOutputFiles = files; // <--- Error is here
}
[Theory]
[MemberData(nameof(ExpectedOutputFiles))]
public void OutputFile_ShouldBeParsedCorrectlyAsJSON_RFC8259(string filename)
{
// Test parsing output files with Newtonsoft.Json and System.Text.Json
var json = File.ReadAllText(filename);
JToken.Parse(json);
// System.Text.Json have better default options compatible with RFC 8259 specification
JsonDocument.Parse(json);
}
Возможно ли это, или мне следует создать [Fact]
модульный тест и читать файлы в foreach
цикле?
Комментарии:
1. Проблема просто в том , что это
ExpectedOutputFiles
естьIEnumerable<object[]>
, иfiles
естьIEnumerable<string>
. xUnit хочетIEnumerable<object[]>
, чтобы каждый элемент в полеIEnumerable
представлял собой массив объектов, содержащий все параметры для передачи в ваш метод тестирования. Ваш метод тестирования имеет 1 параметр, поэтому каждый элемент должен быть массивом объектов из 1 элемента. Т. е. вы хотитеExpectedOutputFiles = files.Select(x => new object[] { x })
Ответ №1:
Переместите код из конструктора в статический элемент
public static IEnumerable<object[]> ExpectedOutputFiles() {
var files = Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, GetOutputDataFolder()));
foreach(var file in files) {
yield return new object[] { file };
}
}
//...
и возвращать каждый файл в массиве объектов
Справочная Теория xUnit: Работа С Данными InlineData, MemberData, ClassData
Комментарии:
1. Спасибо за быстрый ответ