Используйте имена файлов из определенного пути в качестве MemberData в xUnit. Преобразуйте `IEnumerable` в » IEnumerable`

#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. Спасибо за быстрый ответ