将测试参数传递给Theory时,让测试记者分解测试

时间:2017-05-16 15:36:22

标签: c# unit-testing xunit

我将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")

这可能吗?

1 个答案:

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

}