C# 将func参数传递给理论时,让测试报告员分解测试

C# 将func参数传递给理论时,让测试报告员分解测试,c#,unit-testing,xunit,C#,Unit Testing,Xunit,我将Func参数传递给单元测试理论。看看我在做什么的要点 我遇到的问题是,测试报告没有单独分解结果。下面是一个小例子来说明。生产理论会有更多的案例 public class TestReporting { public static IEnumerable<object[]> BoolTestData() { yield return new object[] { true, true }; yield return new object[] { true, fa

我将Func参数传递给单元测试理论。看看我在做什么的要点

我遇到的问题是,测试报告没有单独分解结果。下面是一个小例子来说明。生产理论会有更多的案例

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);
  }
}
请注意,在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")

这可能吗?

这改进了报告--您可以在失败的字符串测试中看到结果,至少:

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);
  }

}
公共类测试报告{
公共静态IEnumerable BoolTestData(){
返回新对象[]{true,true};
返回新对象[]{true,false};
}
[理论,成员数据(名称(BoolTestData))]
公共无效检查BOOLEQUALITY(bool b1、bool b2){
断言相等(b1,b2);
}
公共静态IEnumerable RawTestData(){
收益率回报(“Hello”,str=>str.Substring(3),“lo”);
收益率回报(“世界”,str=>str.Substring(0,4),“世界”);
}
公共静态IEnumerable StringTestData(){
返回RawTestData().Select(vt=>newobject[]{vt.Item1,vt.Item2,vt.Item3});
}
[理论,成员数据(名称(StringTestData))]
public void RunStringTest(字符串输入、表达式func、字符串预期输出){
var output=func.Compile()(输入);
Assert.Equal(预期输出、输出);
}
}
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);
  }

}