Как реализовать тестовые данные в файле JSON в модульном тесте с управлением данными в. NET с использованием C# - PullRequest
1 голос
/ 01 марта 2020

Я делал модульное тестирование, используя пакет xUnit для моей библиотеки классов. Я хотел бы попробовать подход JSON, а не обычный объектный подход для модульного тестирования, управляемого данными. Однако я нигде не вижу, чтобы это было возможно.

То, на чем я застрял, - это управляемый данными тест. Для MemberData требуются тестовые данные в виде IEnumerable<object[]>, когда я вызываю данные из файла JSON, они вводятся в мой класс модели данных. Я добавляю их в IEnumerable<object[]>? Или есть другой способ сделать это?

Вот код, который у меня пока есть:

Это файл json, который содержит 5 тестовых данных:

{
  "user": [
    {
      "name": "John",
      "age": 12,
      "gender": "Male",
      "Hobby": "Reading"
    },
    {
      "name": "Susan",
      "age": 34,
      "gender": "Female",
      "Hobby": "Gardening"
    },
    {
      "name": "Larry",
      "age": 24,
      "gender": "Male",
      "Hobby": "Gaming"
    },
    {
      "name": "Jack",
      "age": 3,
      "gender": "Male",
      "Hobby": "Sleeping"
    },
    {
      "name": "Minnie",
      "age": 15,
      "gender": "Female",
      "Hobby": "Partying"
    }
  ]
}

Это файл класса теста:

private User GetTestData()
{
     var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestData.json"); 
     var reader = new StreamReader(filePath);
     var jsonStr = reader.ReadToEnd();
     var jsonObj = JObject.Parse(jsonStr);

     var testDataObj = jsonObj["user"].ToString();
     var testData = JsonConvert.DeserializeObject<User>(testDataObj);

     return testData;
}

public static IEnumerable<object[]> ValidUserTestData()
{
     //What should I do here?   
}

[Theory]
[MemberData(nameof(ValidUserTestData))]
public void Test1()
{

}

Это правильный способ реализации теста такого типа? Или есть ли другие лучшие варианты использования файла JSON в тесте накопителя данных?

Спасибо.

1 Ответ

3 голосов
/ 01 марта 2020
Атрибут

MemberData принимает IEnumerable<object[]> объектов, которые будут передаваться вашему методу тестирования один за другим. Итак, вы должны десериализовать ваш JSON в массив объектов (ваш образец json содержит массив User объектов), а затем вернуть его из метода ValidUserTestData. Также убедитесь, что Test1() принимает правильный параметр

[Theory]
[MemberData(nameof(ValidUserTestData))]
public void Test1(User user)
{
    //test logic against every User instance
}

ValidUserTestData может быть объявлено следующим образом: сначала прочитайте json, затем преобразуйте его в перечисление User объектов и верните это IEnumerable<object[]>

public static IEnumerable<object[]> ValidUserTestData()
{
    var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestData.json");
    var json = File.ReadAllText(filePath);
    var jobject = JObject.Parse(json);
    var users = jobject["user"]?.ToObject<IEnumerable<User>>();

    foreach (var user in users ?? Enumerable.Empty<User>())
    {
        yield return new[] { user };
    }
}

Каждый отдельный элемент в IEnumerable<object[]> представляет набор параметров, принятых методом испытаний. Вам понадобится только один входной параметр в вашем методе тестирования, поэтому каждый object[] содержит один user экземпляр.

Об этом очень хорошая статья Создание параметризованных тестов в xUnit

...