4

是什么导致消息“未设置批准以使用您的测试框架。”?

我们有一个基于 ApprovalTests 的单元测试在夜间远程团队构建中失败,但有以下例外:


测试方法 Test_CanvasModeConverters 抛出异常:
System.Exception: Approvals 未设置为使用您的测试框架。
它目前支持 [NUnit, MsTest, MbUnit, xUnit.net] 添加一个使用 ApprovalTests.StackTraceParsers.StackTraceParser.AddParser() 方法来添加 ApprovalTests.StackTraceParsers.IStackTraceParser 的实现,并支持您的测试框架。要了解如何实施,请参阅http://blog.approvaltests.com/2012/01/creating-namers.html


此单元测试在本地 VS2010 单元测试运行(即 mstest)中顺利通过。它还在远程团队“签入”构建中顺利通过(即在每个代码签入时运行)。

我们在测试开始时记录了一些诊断信息,以识别正在运行的 ApprovalTests.dll 程序集......

--------------------
ApprovalTests, Version=1.21.4657.21485, Culture=neutral, PublicKeyToken=11bd7d124fc62e0f:
CodeBase = file:///E:/BldSrc/27/305/TestResults/NightlyBuild/Client[2]/Out/ApprovalTests.DLL
FullName = ApprovalTests, Version=1.21.4657.21485, Culture=neutral, PublicKeyToken=11bd7d124fc62e0f
GlobalAssemblyCache = False
ImageRuntimeVersion = v4.0.30319
Location = E:\BldSrc\27\305\TestResults\NightlyBuild\Client[2]\Out\ApprovalTests.dll
Company Name = 
Assembly Product = ApprovalTests
--------------------

这是堆栈跟踪...

ApprovalTests.StackTraceParsers.StackTraceParser.Parse(StackTrace stackTrace)
ApprovalTests.Namers.UnitTestFrameworkNamer..ctor()
ApprovalTests.Approvals.<.cctor>b__11()
ApprovalTests.Approvals.GetDefaultNamer()
ApprovalTests.Approvals.Verify(IApprovalWriter writer)
ApprovalTests.Approvals.Verify(String text)
ApprovalTests.Combinations.CombinationApprovals.VerifyAllCombinations[A,B,C,D,E,F,G,H,I](Func`10 processCall, String format, Func`2 resultFormatter, IEnumerable`1 aList, IEnumerable`1 bList, IEnumerable`1 cList, IEnumerable`1 dList, IEnumerable`1 eList, IEnumerable`1 fList, IEnumerable`1 gList, IEnumerable`1 hList, IEnumerable`1 iList)
ApprovalTests.Combinations.CombinationApprovals.VerifyAllCombinations[A,B,C,D,E,F,G,H,I](Func`10 processCall, String format, IEnumerable`1 aList, IEnumerable`1 bList, IEnumerable`1 cList, IEnumerable`1 dList, IEnumerable`1 eList, IEnumerable`1 fList, IEnumerable`1 gList, IEnumerable`1 hList, IEnumerable`1 iList)
ApprovalTests.Combinations.CombinationApprovals.VerifyAllCombinations[A,B](Func`3 processCall, IEnumerable`1 aList, IEnumerable`1 bList)
4

4 回答 4

4

正如格雷厄姆所说:

“批准测试通过遍历堆栈跟踪来推断批准文件的名称以获取测试方法名称。”

最有可能的是,我建议您的编译器可能正在删除(内联)实际的测试方法。您可以通过带有注释的方法来防止这种情况

[MethodImpl(MethodImplOptions.NoInlining)]

或者,我认为这是最好的选择,在您的编译器选项中完全关闭该功能(取消选中项目属性中的优化代码按钮)

于 2013-03-01T19:40:35.280 回答
4

我对包含我的测试代码的项目进行了以下更改,并消除了这些错误:

  1. 按照 Llewellyn 的建议禁用代码优化
  2. 在高级构建设置中,将“调试信息”设置为“完整”。在我的项目中,它被设置为仅用于发布版本的 pdb。

同样,我只需要对包含我的测试的项目进行这些更改。

此外,我测试了 Llewellyn 建议的注释,它也有效。

于 2013-04-09T19:05:35.110 回答
2

FWIW,当我的测试方法使用[TestCase(...)]没有的属性时,我看到了这个问题[Test]

[TestCase("example")]
public void Broken_Test(string parameter) {
  //...
}

添加[Test]属性解决了问题

[Test]
[TestCase("example")]
public void Working_Test(string parameter) {
  //...
}
于 2019-09-05T08:53:29.730 回答
1

Approvals Tests 通过遍历堆栈跟踪来推断批准文件的名称以获取测试方法名称。

您的堆栈跟踪中没有您的测试名称,这可能意味着;

  • 您没有包含完整的堆栈跟踪,其中包含相关信息以回答您的问题
  • 或者您的测试可能由于缺少 pdb 而没有获取所需的堆栈跟踪信息?
于 2013-02-22T11:18:00.903 回答