Получить тестовый репортер, чтобы разбить тест при передаче параметров функции в теорию

Я передаю параметры 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")

Это возможно?


person William Jockusch    schedule 16.05.2017    source источник


Ответы (1)


Это улучшает отчетность — вы видите результаты внутри неудачного теста строки, по крайней мере:

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

}
person William Jockusch    schedule 16.05.2017