16

注入された依存関係のメソッドが特定の回数呼び出されることをテストしている次のことを検討してください。

[Fact]
public void WhenBossTalksEmployeeBlinksTwice()
{
    // arrange
    var employee = new Mock<IEmployee>();
    employee.Setup(e => e.Blink());

    var boss = new Boss(employee.Object);

    // act
    boss.Talk();

    // assert
    employee.Verify(e => e.Blink(), Times.Exactly(2)); // Passes as expected
    employee.Verify(e => e.Blink(), Times.Exactly(1)); // Fails as expected
}

失敗したテストを強制すると、出力は次のようになります。

Moq.MockException: モックで呼び出しが 1 回実行されませんでした: e => e.Blink()

より良いのは次のようなものです:

Moq.MockException: 呼び出しが予期せず 1 回ではなく 2 回実行されました: e => e.Blink()

テストに関連する項目は次のとおりです。

public interface IEmployee { void Blink(); }

public class Boss {
    private readonly IEmployee _employee;
    public Boss(IEmployee employee) { _employee = employee; }

    public void Talk() {
        _employee.Blink();
        _employee.Blink();
    }
}

失敗したテストのエラー メッセージで、依存関係のメソッドが呼び出された実際の回数を取得して表示することは可能ですか?

それが重要かどうかはわかりませんが、私は Moq v3.1.416.3 を使用しています (最新ではないことはわかっていますが、私が使用している別のライブラリはまだ Moq 4.x に更新されていません…)

4

1 に答える 1

21

Moq3 の情報を直接収集する方法がわかりません。私がすることは、Blink のセットアップでコールバックを使用することです。

int count = 0;
employee.Setup(e => e.Blink()).Callback(() => count++);

...
employee.Verify(e => e.Blink(), Times.Exactly(1), "Moq.MockException: Invocation was unexpectedly performed " + count + " times, not 1 time: e => e.Blink()"); // Fails as expected
于 2013-05-28T21:36:33.747 に答える