NMock2メモ

NMok2を使用する際のメソッドの呼び出し順番の指定について。
NMock2ではNMockと違い、普通に使用したたけでは呼されたメソッドの順番のチェックまで行わない。

擬似オブジェクトから起動するメソッドの順番まで指定する場合は
mockeryオブジェクトのOrderedプロパティをusing()ステートメントと組み合わせる。
例)

public void テスト対象メソッド名
{
    mockery = new Mockery();            // Mockeryインスタンス生成
    iTest = mockery.NewMock<ITestIF>(); // ITestIFインターフェースに擬似オブジェクトのインスタンスを設定する
    cuseTest = new CUseTest(iTest);     // テスト対象クラスの生成

    using (mockery.Ordered)
    {          
	// 補足:
	// cuseTestのexec()からは、ITestIFのexec1()が呼びされています。
	// cuseTestのrand()からは、ITestIFのexec2()が呼びされています。

	// テスト対象メソッドを実行
	// ここの検証は成功
	Expect.Once.On(iTest).Method("exec1").With(Is.AtLeast(1)).Will(Return.Value(1));
	Expect.Once.On(iTest).Method("exec2").With(Is.AtLeast(1)).Will(Return.Value(2));
	Assert.AreEqual(cuseTest.exec(), 1);
	Assert.AreEqual(cuseTest.rand(), 2);	                
	mockery.VerifyAllExpectationsHaveBeenMet();
			
	// テスト対象メソッドを実行
	// ここの検証は失敗
         Expect.Once.On(iTest).Method("exec1").With(Is.AtLeast(1)).Will(Return.Value(1));
         Expect.Once.On(iTest).Method("exec2").With(Is.AtLeast(1)).Will(Return.Value(2));
         Assert.AreEqual(cuseTest.rand(), 2); // exec1より先にexec2が呼び出されるためエラー発生
         Assert.AreEqual(cuseTest.exec(), 1);
	mockery.VerifyAllExpectationsHaveBeenMet();

    }
}

また、擬似オブジェクトインスタンスのメソッドの引数チェックをする場合に
値がゆるやかなチェックを行えるようですね。

// exec1メソッドの第1引数が1以上5以下であること。
Expect.Once.On(iTest).Method("exec1").With(Is.AtLeast(1) & Is.AtMost(5)).Will(Return.Value(1));