xUnit параметризованный тест с объектом
Всем привет. Пытаюсь написать параметризованный тест для приложения ASP.NET Core MVC, с использованием xUnit. Например, есть unit-тест вида:
[Theory]
public void ExampleTest(Person person)
{
//DoSmth()
}
Вопрос заключается в том, как на вход тесту передать список объектов Person? Т.е. чтобы один и тот же тест прошел на разных объектах типа Person. Например, если аргументы теста имеют простой тип, то можно в атрибутах метода прописать несколько атрибутов [InlineData(...)], но как быть в случае сложного типа?
Ответы (1 шт):
Например, так:
[Theory]
[InlineData(30, "Bob")]
[InlineData(20, "Alice")]
public void ExampleTest(int age, string name)
{
var person = new Person(age, name);
//DoSmth()
}
В атрибуте InlineData задаём данные, из которых в тестовом методе конструируется объект нужного типа.
Другой способ - используем атрибут ClassData:
[Theory]
[ClassData(typeof(PersonTestData))]
public void ExampleTest(Person person)
{
//DoSmth()
}
В этом атрибуте указываем класс-источник данных:
public class PersonTestData : IEnumerable<object[]>
{
public IEnumerator<object[]> GetEnumerator()
{
yield return new object[] { new Person(30, "Bob") };
yield return new object[] { new Person(20, "Alice") };
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
Третий способ - источником данных является свойство этого же класса:
[Theory]
[MemberData(nameof(PersonData))]
public void ExampleTest(Person person)
{
Assert.NotNull(person.Name);
Assert.True(person.Age > 0);
}
public static IEnumerable<object[]> PersonData =>
new List<object[]>
{
new object[] { new Person(30, "Bob") },
new object[] { new Person(20, "Alice") }
};