これまで、私は Rhino Mocks と、典型的な厳密なモックのみを使用してきました。現在、私はプロジェクトで Moq を使用していますが、適切な使用方法について疑問に思っています。
オブジェクト Foo と、オブジェクト Buzz の Bizz メソッドを呼び出すメソッド Bar があると仮定します。
私のテストでは、Bizz が呼び出されることを確認したいので、次の 2 つのオプションが考えられます。
厳しい模擬試験で
var mockBuzz= new Mock<IBuzz>(MockBehavior.Strict);
mockBuzz.Setup(x => x.Bizz()); //test will fail if Bizz method not called
foo.Buzz = mockBuzz
foo.Bar();
mockBuzz.VerifyAll();
ゆるいモックで
var mockBuzz= new Mock<IBuzz>();
foo.Buzz = mockBuzz
foo.Bar();
mockBuzz.Verify(x => x.Bizz()) //test will fail if Bizz method not called
これを行うための標準的または通常の方法はありますか?
ベストアンサー1
ユニット テストで最初にモックを使い始めたときは、厳密なモックを使用していました。これはあまり長くは続きませんでした。私がこれをやめたのは、実際には 2 つの理由があります。
- テストが脆弱になります - 厳密なモックでは、セットアップ メソッドが呼び出されること、および他のメソッドが呼び出されないことの 2 つ以上のことをアサートします。コードをリファクタリングすると、テストしようとしている内容がまだ正しい場合でも、テストが失敗することがよくあります。
- テストが読みにくくなります - テスト対象と実際には関係がない場合でも、モックで呼び出されるすべてのメソッドを設定する必要があります。このテストを読んだ人は、何がテストにとって重要で、何が実装の副作用に過ぎないかを判断するのが難しくなります。
これらの理由から、ユニット テストではルーズ モックを使用することを強くお勧めします。