web-dev-qa-db-ja.com

Rhino.Mocks AssertWasCalled()を正しく使用する方法は?

_mocks.ReplayAll()を呼び出し、次に1つ以上の_mockedObject.AssertWasCalled()を呼び出し、次に_mocks.VerifyAll()を呼び出します。しかし、「モックオブジェクトがレコード状態の場合、このアクションは無効です」と表示されます。

[Test]
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused()
{
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused };
    _taskDataProvider.Expect(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused));
    _mockRepository.ReplayAll();
    _manager.SetStateExecuting(task);
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, 
                                                                  TaskState.Executing));
    _mockRepository.VerifyAll();
}

これらのメソッドが正しく機能するように呼び出す正しい順序は何ですか?

18
HiveHicks

Jon Krugerのブログ投稿 "テストを通じて文書化されたサイモックの使用方法" には、サイモックメソッドで実行できるすべての簡単な例があります。彼はまた、私が学ぶのに非常に役立ったとあなたができないことを示しています。

前に述べたように、静的コンストラクターでArrange、Act、Assert構文を使用すると読みやすくなります。ブログ投稿には、両方の方法の例が示されています。

Jonのサンプルコードの例を次に示します。

新しい構文:

 [Test]
    public void You_can_check_to_see_if_a_method_was_called()
    {
        var stub = MockRepository.GenerateStub<ISampleClass>();

        stub.MethodThatReturnsInteger("foo");

        stub.AssertWasCalled(s => s.MethodThatReturnsInteger("foo"));
        stub.AssertWasCalled(s => s.MethodThatReturnsInteger(Arg<string>.Is.Anything));
    }

古いスタイル:

    [Test]
    public void Calling_virtual_methods_will_call_the_actual_method()
    {
        var mockRepository = new MockRepository();
        var sampleClass = mockRepository.PartialMock<SampleClass>();
        sampleClass.Replay();

        sampleClass.VirtualMethod("foo").ShouldEqual(3);
        sampleClass.VirtualMethodWasCalled.ShouldBeTrue();
        sampleClass.AssertWasCalled(c => c.VirtualMethod("foo"));
    }
17
Maggie

古い録音/再生パターンと新しい AAAパターン を混合しています。

レコードモードで「これらの引数で呼び出されない」期待値を設定する通常の方法は、次のようになります。

_taskDataProvider.Expect(
    p => p.GlobalStateUpdate(task.ID, TaskState.Executing)).Repeat.Never();

または、予期しない呼び出しを許可しない厳密なモックを使用することもできます。

AssertWasCalledAssertWasNotCalledは、アサーションを最後に配置するAAAを対象としています。 Record/Replay構文では、動作と期待の両方を、再生モードに切り替える前の開始時に設定する必要があります。

AssertWasNotCalledは実際には記録/再生でも機能する可能性がありますが、両方のアプローチの要素を混合するのが好きではないため、試したことはありません。不必要に複雑になります。)

12
Wim Coenen