私は '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>();
に私の呼び出しは()メソッドは、モデルのきれいな嘲笑インスタンスを私に提供していない理由を私に言うことができますか?
NSubstituteは自動的にインターフェイスを返すメンバを置き換えます。 [Recursive mocks](http://nsubstitute.github.io/help/auto-and-recursive-mocks/)を参照してください。これはなぜ、 'model.currentlyDisplayedMessage'が新たに置換された' model'のために初期化されるのかを説明していると思います。 (あなたがこの説明に満足しているなら、あなたの答えにそれを含めてください。) –