web-dev-qa-db-ja.com

MoqのVerifyAll()の目的は何ですか?

私は MoqのVerifiable()の目的は何ですか? で質問を読み、この質問を心に留めています。それを説明するあなたの助けが必要です。

47
Nam G VU

VerifyAll()は、すべての期待が満たされていることを確認するためのものです。あなたが持っていると仮定します:

myMock.Setup(m => m.DoSomething()).Returns(1);
mySut.Do();
myMock.VerifyAll(); // Fail if DoSomething was not called

HTH

45
ema

@emaの回答を完成させようと思います。おそらく読者にもっと洞察を与えるでしょう。 mockedオブジェクトがあるとします。これはsutへの依存関係です。 2つのメソッドがあり、例外が発生しないように、またはsutにさまざまなシナリオを作成するためにそれらをセットアップするとします。

_var fooMock = new Mock<Foo>();
fooMock.Setup(f => f.Eat()).Returns("string");
fooMock.Setup(f => f.Bark()).Returns(10);

_sut = new Bar(fooMock.Object);
_

これがarrangeステップでした。次に、実際にテストしたいメソッドを実行します(今あなたはact):

__sut.Test();
_

次にassert with VerifyAll()

_fooMock.VerifyAll();
_

ここで何をテストしますか? setupメソッドがcalledであったかどうかをテストします。この場合、どちらかのFoo.Eat() or Foo.Bark()が呼び出されなかった場合、例外が発生し、テストは失敗します。したがって、実際には、あなたはmixステップを配置してアサートします。また、それが呼び出された回数を確認することはできません。これは_.Verify_で実行できます(Eat()関数にParamと呼ばれるプロパティを持つパラメーターNameがあるとします):

_fooMock.Verify(f => f.Eat(It.Is<Param>(p => p.Name == "name")), Times.Once);
_
11
OlegI