Я передаю параметры Func теории модульного тестирования. См. Передача сложных параметров в [Theory], чтобы понять, что я делаю.
Проблема, с которой я сталкиваюсь, заключается в том, что отчеты о тестировании не разбивают результаты по отдельности. Вот небольшой пример для иллюстрации. В теории производства было бы гораздо больше случаев.
public class TestReporting {
public static IEnumerable<object[]> BoolTestData() {
yield return new object[] { true, true };
yield return new object[] { true, false };
}
[Theory, MemberData(nameof(BoolTestData))]
public void CheckBoolEquality(bool b1, bool b2) {
Assert.Equal(b1, b2);
}
public static IEnumerable<(string, Func<string, string>, string)> RawTestData() {
yield return ("Hello", str => str.Substring(3), "lo");
yield return ("World", str => str.Substring(0, 4), "worl");
}
public static IEnumerable<object[]> StringTestData() {
return RawTestData().Select(vt => new object[] { vt.Item1, vt.Item2, vt.Item3 });
}
[Theory, MemberData(nameof(StringTestData))]
public void RunStringTest(string input, Func<string, string> func, string expectedOutput) {
var output = func(input);
Assert.Equal(expectedOutput, output);
}
}
Вывод тестового прогона -- перефразировано, так как кажется невозможным скопировать и вставить только информацию верхнего уровня
Failed Tests(2)
CheckBoolEquality(b1: True, b2: False)
RunStringTest
Passed Tests(1)
CheckBoolEquality(b1: True, b2: True)
Обратите внимание, что в случае с логическим значением мой тест разбивается на два теста: проходящее утверждение, что true=true, и ошибочное утверждение, что true=false. Это то, что я хочу.
Но в случае со строкой он, по-видимому, не знает, как описать Func, поэтому просто сдается и говорит, что все это не удалось.
Я был бы совершенно счастлив, если бы он просто сообщал о тех частях, которые он может, то есть что-то вроде этого:
Failed Tests(2)
CheckBoolEquality(b1: True, b2: False)
RunStringTest("World")
Passed Tests(2)
CheckBoolEquality(b1: True, b2: True)
RunStringTest("Hello")
Это возможно?