履歴:nUnit 3.複雑な継承を持つテストがあります。 SetUp
またはOneTimeSetUp
に特定のオブジェクトが作成されます。これらのメソッドは仮想です。このオブジェクトが閉じていない場合、リークが発生します。nUnit拡張モジュールは、テストと同じアセンブリ内にあります。
問題:オブジェクトがTearDown
またはOneTimeTearDown
で破壊されていますが、SetUp
またはOneTimeSetUp
が成功したときに、それらが唯一と呼ばれています。したがって、例外がTearDown
またはOneTimeTearDown
のどこかで発生すると、リークが発生します。私が言及したように、複数の継承レベルが存在するため、異なるクラスの異なるスタックフレームで、例外とクリティカルオブジェクトの作成が行われる可能性があります。
私がしたいこと:初期化が完了してクリティカルなオブジェクトがクリーンアップされる前に、エラーが発生した場合には、ITestEventListener
に反応させます。私はクラスを作成した私のテストアセンブリに:
namespace My.Whatever.Tests.Web.Util
{
[Extension(EngineVersion = "3.4")]
public class NunitEventListener : ITestEventListener
{
public void OnTestEvent(string report)
{
Debug.WriteLine(report);
}
}
}
その後、私は
- VS(NUnitの3テストアダプタ)
- を通じてテストを実行しようとした私はを試してみました何
nUnitコンソール
この拡張機能はロードされていないようです。
質問:私は間違っていますか?情報の
出典:https://github.com/nunit/docs/wiki/Event-Listeners、https://github.com/nunit/docs/wiki/Writing-Engine-Extensions
私は答えとしてこれを受け入れますが、私の場合は「テストに失敗しました」というイベントを購読する方法は他にもありますか?さもなければ、私が見ることができる最も簡単なことは、AOPを使うか、動的にILを出して、実行時のコードにパッチを当てることです。 –
私の答えの更新を見てください。あなたがしたいのは、テストが失敗したことに注意するだけであれば、ティアダウンの1つでテストを行うことができるはずです。具体的には、最後のティアダウンで実行します。これは最初のセットアップ実行に相当します。私はそのティアダウンが実行されない状況は考えられません。 – Charlie
こんにちはMr Poole、私はそれを数回検証しました。私は次のシナリオに当たっています:1)私のテストはOneTimeSetUpとSetUpを持っています。 2)SetUpは、空になるようにオーバーライドされた基本クラスの仮想メソッドです。 3)OneTimeSetupはオブジェクトを作成します。 4)チームシティログに表示されるもの:SetUp ErrorはOneTimeSetupを指し、オブジェクトの初期化内でinvalidOperationExceptionが発生し、OneTimeTearDownは実行されません。私のoneTimeTearDownはこのケースを予期しており、呼び出されると(ログを生成する)実行されます。しかし、そうではありませんでした。 –