2017-04-11 10 views
2

私は 'HideCurrentTitleBarMessageTask'という名前のクラスの機能をユニットテストするTestFixtureマーククラスを持っています。NUnitは、各テストの間にTestFixturesとしてマークされたクラスを再インスタンス化しますか?

このクラスでは、[Setup]メソッドでインターフェイスをモックするために代用を使用し、テストクラスIセットアップのいくつかのテストでは、そのモックされたインターフェイスメンバーの1つからの戻り値を設定します。

[TestFixture] 
public class TestClass_A { 

    private ITitleBarMessageModel model; 
    private ITitleBarMessage message; 
    private HideCurrentTitleBarMessageTask task; 
    private bool taskCompleteFired; 


    [SetUp] 
    public void SetUp() { 
     taskCompleteFired = false; 
     model = Substitute.For<ITitleBarMessageModel>(); 
     message = Substitute.For<ITitleBarMessage>(); 
     //model.currentlyDisplayedMessage = null; 
     task = new HideCurrentTitleBarMessageTask(); 
     task.Init(model); 
     task.Completed += (t) => { taskCompleteFired = true; }; 
    } 

    [Test] 
    public void Test_A() { 
     task.Execute(); 
     Assert.That(taskCompleteFired, Is.True); 
    } 

    [Test] 
    public void Test_B() { 
     model.currentlyDisplayedMessage.Returns(message); 
     task.Execute(); 
     message.Received(1).Hide(); 
     Assert.That(taskCompleteFired, Is.False); 
    } 
} 

HideCurrentTitleBarMessageTaskのExecute関数はTEST_Bで、Iセットアップmodel.currentlyDisplayedMessageと戻り値を行い、この

public override void Execute() { 
     if (model.currentlyDisplayedMessage != null) { 
      //Some irrelevant stuff 
     } else { 
      Completed(this); 
     } 
} 

お知らせのように見えます。

Test_Aの1行目にブレークポイントがあると、デバッガでというモデルが表示されています。実際に表示されたメッセージは、実際には割り当てられていません。それがあってはならないとき。おそらく、方法セットアップ前と呼ばれていた、そして線

model = Substitute.For<ITitleBarMessageModel>(); 

を効果的にモデルに新しいモックインスタンスを再割り当て、実行された。にもかかわらず これにより、Test_Aが失敗します。今

、セットアップ方法でコメントアウト行

//model.curentlyDisplayedMessage = null; 

に気づきます。これをコメント解除して、モデルの参照をnullに明示的に設定して問題を修正します。 (私は[TearDown]のマークされたメソッドでも同じ結果が得られると仮定しています)。

NUnitはTestClassを一掃しないでテストの間に最初から始めませんか?そうでない場合

、誰がして、私のテストを開始するには、セットアップで

model = Substitute.For<ITitleBarMessageModel>(); 

に私の呼び出しは()メソッドは、モデルのきれいな嘲笑インスタンスを私に提供していない理由を私に言うことができますか?

答えて

3

いいえ、NUnitは、テストケースごとにフィクスチャクラスの新しいインスタンスを作成しません。 1つのインスタンスが作成され、テストごとに再利用されます。これは他のいくつかのテストフレームワークとは異なりますが、NUnitが(2000年以来)常に働いていた方法です。

これは、オブジェクトの状態の使い方に注意する必要があることを意味しています。 1.可能な限り小さな状態を使用してください。 2. SetUpを使用して初期化し、TearDownをクリーンアップします。

@ Davidさんのコメントごとに... NSubstituteは自動的にインターフェイスを返すメンバーを代用します。再帰モックを参照してください。これは、model.currentlyDisplayedMessageが新しく置換されたモデルのために初期化される理由を説明していると思います。

+0

NSubstituteは自動的にインターフェイスを返すメンバを置き換えます。 [Recursive mocks](http://nsubstitute.github.io/help/auto-and-recursive-mocks/)を参照してください。これはなぜ、 'model.currentlyDisplayedMessage'が新たに置換された' model'のために初期化されるのかを説明していると思います。 (あなたがこの説明に満足しているなら、あなたの答えにそれを含めてください。) –

関連する問題