TGViewer
StepOne | Степан Минин StepOne | Степан Минин @steponeit · 3.27K subscribers
Post #372 3.29K
Строго типизированные теории в xUnit

Для передачи данных в тест есть много способов: [InlineData] [MemberData] [ClassData]

Последние два способа оперируют контрактом IEnumerable<object[]>

Встаёт вопрос - как надавать по рукам тем, кто засунет в object[] то, что в тест попадать не должно?

Для этого существует класс TheoryData<>

Он даёт все преимущества строгих проверок типов C# на этапе компиляции

Использовать можно по-разному, например так:
public class CalculatorTestData : TheoryData<int, int, int>
{
public CalculatorTestData()
{
Add(1, 2, 3);
Add(-4, -6, -10);
Add(-2, 2, 0);
Add(int.MinValue, -1, int.MaxValue);
Add(1.5, 2.3m, "The value"); // will not compile!
}
}


И далее в тесте:

[Theory]
[ClassData(typeof(CalculatorTestData))]
public void CanAdd(int value1, int value2, int expected)
{
var calculator = new Calculator();
var result = calculator.Add(value1, value2);
Assert.Equal(expected, result);
}


А пример с мембер датой можно подсмотреть в моём репозитории hydrascript:
https://github.com/Stepami/hydrascript/blob/master/tests/HydraScript.IntegrationTests/SuccessfulProgramsTests.cs
GitHub hydrascript/tests/HydraScript.IntegrationTests/SuccessfulProgramsTests.cs at master · Stepami/hydrascript TypeScript & Go inspired open-source public research project written in C# - Stepami/hydrascript
  • 👍 13
  • ❤ 2
  • 🔥 2
More from @steponeit
  1. Sep 27, 2026Post #860
  2. Sep 25, 2026Рассказал как я добавил в HydraScript объекты и методы без классов и сделал протоколы. Стр…
  3. Sep 22, 2026Post #858
  4. Sep 21, 2026Post #857
  5. Sep 15, 2026Напомню, что у меня есть WireMock.Grpc.Protobuf — расширение для тех, кто пишет компонентн…
  6. Sep 12, 2026StepOne — официальный контрибутор FusionCache 🤙 Между набросами можно ещё и код писать Fu…
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 →