我将Func参数传递给单元测试理论。请参阅Pass complex parameters to [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)
请注意,在bool案例中,它将我的测试分为两个测试,一个声明为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")
这可能吗?
答案 0 :(得分:0)
这改进了报告 - 您在失败的字符串测试中看到了结果,至少:
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, Expression<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, Expression<Func<string, string>> func, string expectedOutput) {
var output = func.Compile()(input);
Assert.Equal(expectedOutput, output);
}
}