Для передачи данных в тест есть много способов:
[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