4

「テスト フレームワークを使用するように承認が設定されていません」というメッセージが表示される原因は何ですか?

ApprovalTests ベースのユニット テストが夜間のリモート チーム ビルドで失敗し、次の例外があります。


テスト メソッド Test_CanvasModeConverters が例外をスローしました:
System.Exception: Approvals は、テスト フレームワークを使用するように設定されていません。
現在、[NUnit、MsTest、MbUnit、xUnit.net] をサポートしています。1 つ追加するには、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

グラハムが言ったように:

「ApprovalsTestsは、スタックトレースをたどってテストメソッド名を取得することにより、承認ファイルの名前を推測します。」

ほとんどの場合、コンパイラが実際のテストメソッドを削除(インライン化)している可能性があります。アノテーション付きのメソッドでこれを防ぐことができます

[MethodImpl(MethodImplOptions.NoInlining)]

または、これが最良のオプションだと思います。コンパイラオプションでこの機能を完全にオフにします(プロジェクトプロパティの[コードの最適化]ボタンのチェックを外します)。

于 2013-03-01T19:40:35.280 に答える
4

テスト コードを含むプロジェクトに次の変更を加えたところ、これらのエラーは解消されました。

  1. Llewellyn の提案に従ってコードの最適化を無効にする
  2. Advanced Build Settings で、「Debug Info」を「Full」に設定します。プロジェクトのリリース ビルドでは、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 に答える