Безопасность Типов в xUnit с Помощью TheoryData<T>
В xUnit есть небольшая, но очень полезная особенность – класс TheoryData<T>.
Проблема
Имеем следующий код тестов репозитория:
public static IEnumerable<object[]>
Data => new List<object[]>
{
new object[] {
new Action<IServiceCollection>(
s => s.UseSqliteAsStorageProvider())
},
new object[] {
new Action<IServiceCollection>(
s => s.UseSqlAsStorageProvider())
},
new object[] {
new Action<IServiceCollection>(
s => s.UseInMemoryAsStorageProvider())
}
};
[Theory]
[MemberData(nameof(Data))]
public void TestStorageProvider(
Action<IServiceCollection> act)
{ … }
Проблема здесь в том, что данные имеют тип IEnumerable<object[]>, а параметр act — тип Action<IServiceCollection>. То есть теоретически можно передать в метод что угодно, и компилятор с радостью это примет. Вот тут-то и пригодится TheoryData<T>.
Решение
TheoryData<T> — это класс, который позволяет обертывать данные строго типизированным способом. Например:
public static TheoryData<Action<IServiceCollection>>
Data => new()
{
s => s.UseSqliteAsStorageProvider(),
s => s.UseSqlAsStorageProvider(),
s => s.UseInMemoryAsStorageProvider()
};
[Theory]
[MemberData(nameof(Data))]
public void TestStorageProvider(
Action<IServiceCollection> act)
{ … }
Точно такой же тест, но более типобезопасный. Теперь компилятор не позволит передать в метод ничего, кроме Action<IServiceCollection>.
Источник: https://steven-giesel.com/blogPost/a8aa3385-8829-444a-b269-7ecb38aeaf2f/typesafety-in-xunit-with-theorydatat