TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.75K subscribers
Post #2254 2.32K
День 1865. #ЗаметкиНаПолях
Безопасность Типов в 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
  • 👍 21
More from @netdeveloperdiary
  1. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  2. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  3. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  4. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  5. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  6. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →