2017-12-07 10 views
1

NUnit 3(3.8.1)の拡張機能を作成しようとしていますが、失敗した場合には失敗します(Debug.Assert(...))それは失敗したアサーションダイアログを表示するためです)。失敗したDebug.AssertでNUnit 3の拡張機能をテストする

NUnit 2アドインでは、すべてのデバッグトレースリスナーの登録を解除し、例外をスローするだけの方法で追加することができました(例:here)。しかし、これはもはやNUnit 3では動作しません。

エクステンションを正常に展開することができ、そのコードが実行されています。

[Extension(Description = "Failed Assertions Tracker", EngineVersion = "3.4")] 
public class TrackerEventListener : ITestEventListener 
{ 
    public void OnTestEvent(string report) 
    { 
     Console.WriteLine(report); // prints -> so I know this method is being called 
     Debug.Listeners.Clear(); 
     Debug.Listeners.Add(new UnitTestTraceListener()); 
    } 
} 

しかし、私のユニットテストは、残念ながらまだDefaultTraceListenerがインストールされていることを私に示しています。

[Test] 
public void FailingAssertionShouldNotHang() 
{ 
    foreach (object listener in Debug.Listeners) 
    { 
     Console.WriteLine(listener.GetType().FullName); 
    } 
    Debug.Fail("I'm sorry. I've failed."); 
} 

したがって、テストでは単に失敗するのではなくダイアログが表示されます。

私は間違っていますか?実際のテストが別のコンテキスト(異なるAppDomain、process、?)で実行されるため、静的Listenersコレクションの呼び出しが無効であると思われます。しかし、これが当てはまる場合、どうすれば私の問題を解決することができますか?

+1

[このコメント](https://stackoverflow.com/questions/2662041/can-i-configure-nunit-so-that-debug-fail-doesnt-show-a-message-boxかもしれませ-when-i-run-m/2798663#comment61962711_3184631)助けてください –

+0

@AluanHaddad:私はすべてのテストフィクスチャに自分自身を繰り返したくありません。したがって、私はロジックを拡張機能として記述したいと思います。 – Dejan

+0

@AluanHaddad:申し訳ありませんが、私はこれをあまりにも速く読みました。 SetUpFixtures(https://github.com/nunit/docs/wiki/SetUpFixture-Attribute)を使用すると、テストされたアセンブリにつき1回だけ論理を持つことができます。それは十分に公正な回避策かもしれません。 – Dejan

答えて

1

NUnit 3 Extensionsは、いくつかのケースでNUnit 2 Addinsを置き換えることができますが、実際はまったく異なるテクノロジです。 NUnit 3拡張機能は、フレームワークとは別のエンジンを拡張します。

この場合、拡張機能は、エンジンによって生成されたデバッグトレースまたはアサート出力をキャプチャするトレースリスナを設定しています。エンジンにTraceステートメントが含まれている場合(そうでない場合)、出力が得られます。一方、このフレームワークは喜んで独自のテストを継続しています。

トレースを正常に取得するコードは、テストの実際のフレームワーク実行の一部でなければなりません。これには2つのオプションがあります。

  1. トレースをキャプチャするカスタム属性を作成します。カスタム属性を使用すると、テストの作成または実行時にアクションを実行できます。これらは、フレームワークによってサポートされているさまざまなインターフェイスを実装することによって作成されます。あなたの場合、アセンブリーレベルですべての出力をキャプチャーするために、アセンブリー・レベルで属性を指定したいとします。

  2. フレームワークをまったく拡張せずに、テストの一部としてコードを作成します。 OneTimeSetUp属性を使用してアセンブリレベルのSetUpFixtureでトレース出力をキャプチャし、OneTimeTearDown属性の下にリリースしたいとします。このアプローチはカスタム属性を作成するよりも簡単なので、これは私が使用するものです。

+0

私は秘密にあなたが私の質問に答えることを望んでいました;)その場合、私は2を実装しようとします。 - あなたの継続的な共有と気遣いをありがとう! – Dejan

関連する問題