如何在Approvaltests中添加对xunit的Theory属性的支持

当我尝试使用[Theory]属性修饰的unit testing时使用批准时,它说:

 System.Exception: System.Exception : Approvals is not set up to use your test framework. It currently supports [NUnit, MsTest, MbUnit, xUnit.net] To add one use ApprovalTests.StackTraceParsers.StackTraceParser.AddParser() method to add implementation of ApprovalTests.StackTraceParsers.IStackTraceParser with support for your testing framework. To learn how to implement one see http://blog.approvaltests.com/2012/01/creating-namers.html at ApprovalTests.StackTraceParsers.StackTraceParser.Parse(StackTrace stackTrace) at ApprovalTests.Namers.UnitTestFrameworkNamer..ctor() at ApprovalTests.Approvals.GetDefaultNamer() at ApprovalTests.Approvals.Verify(IApprovalWriter writer) at ApprovalTests.Approvals.Verify(Object text) 

似乎只识别[Fact]属性。 我试图跟踪stacktrace中的链接,但没有任何关于如何将自己的名称/解析器插入批准的内容。

有没有我可以添加自己的名字/解析器的入口点? 它本身似乎微不足道,唯一的问题是如何使用它:

  public class TheoryNamer : AttributeStackTraceParser { protected override string GetAttributeType() { return typeof(TheoryAttribute).FullName; } public override string ForTestingFramework { get { return "xUnit Extensions"; } } } 

这个答案和问题有几个部分。

  1. 如何添加
  2. 命名者
  3. 在审批测试中处理数据驱动的测试

1)如何添加

添加很简单(如果有点粗糙)提到的方法应该是静态的,但它仍然可以工作。

要添加一个,请使用ApprovalTests.StackTraceParsers.StackTraceParser.AddParser()方法添加ApprovalTests.StackTraceParsers.IStackTraceParser的实现,并支持您的测试框架。

所以你需要做一个

 new StackTraceParser().AddParser(new TheoryNamer()); 

我为此道歉,在下一个版本中它将是静态的(第21节)

2)名人

命名者假设为每个批准/接收的文件生成唯一的名称。 这通常是在方法的名称上完成的,但是这里的名称不是唯一的,因为基于理论的测试将是数据驱动的,因此对同一方法有多次调用。

 Naming: classname.methodname(optional: .additionalInformation).received.extension 

因此,您可能必须在其自身的方法中包含其他信息

 public class StringTests1 { [Theory, InlineData("goodnight moon"), InlineData("hello world")] public void Contains(string input) { NamerFactory.AdditionalInformation = input; // <- important Approvals.Verify(transform(input)); } } 

3)在审批测试中处理数据驱动的测试

说实话,在大多数情况下,批准测试中的数据驱动方法不是方法装饰器中的参数。 它通常通过带有lambda变换的VerifyAll。 例如,上面可能看起来像

 [Fact] public void UpperCase() { var inputs = new[]{"goodnight moon","hello world"}; Approvals.VerifyAll(inputs, i => "{0} => {1}".FormatWith(i, i.ToUpperInvariant())); } 

哪个会创建收到的文件:

 goodnight moon => GOODNIGHT MOON hello world => HELLO WORLD 

最好从XUnitStackTraceParserinheritanceTheoryNamer类。
它完美无瑕!
我认为将这样的类添加到ApprovalTests.StackTraceParsers命名空间会很酷:)

 public class XUnitTheoryStackTraceParser : XUnitStackTraceParser { public const string TheoryAttribute = "Xunit.Extensions.TheoryAttribute"; protected override string GetAttributeType() { return TheoryAttribute; } } public class ApproveTheoryTest { static ApproveTheoryTest() { StackTraceParser.AddParser(new XUnitTheoryStackTraceParser()); } [Theory] [UseReporter(typeof(DiffReporter))] [InlineData("file1.txt")] [InlineData("file2.txt")] public void approve_file(string fileName) { NamerFactory.AdditionalInformation = fileName; Approvals.Verify("sample text"); } }