私は単体テストに精通しており、モックとスタブの違いを理解しています。Roy Osherove による最も簡単な説明は、すべての偽物は、あなたがそれらに対してアサートするまではスタブとして始まり、その後それらはモックになるというものです。
繰り返しますが、私はそれをすべて理解しています。私の質問は、「単一の偽のインスタンスをモックとスタブの両方として使用するのは間違っていますか? Rhino Mocks のドキュメント ( http://ayende.com/wiki/Rhino+Mocks+3.5.ashx )から次の例を取り上げます。
public void When_user_forgot_password_should_save_user()
{
var mockUserRepository = MockRepository.GenerateMock<IUserRepository>();
var stubbedSmsSender = MockRepository.GenerateStub<ISmsSender>();
var theUser = new User{HashedPassword = "this is not hashed password"};
mockUserRepository.Stub(x => x.GetUserByName("ayende")).Return(theUser);
mockUserRepository.Expect( x => x.Save(theUser) );
var controllerUnderTest = new LoginController(mockUserRepository, stubbedSmsSender);
controllerUnderTest.ForgotMyPassword("ayende");
mockUserRepository.VerifyAllExpectations();
}
mockUserRepository は mock という単語で名前が付けられており、GenerateMock ファクトリを呼び出していることがわかります。これは、コードのさらに下の方で、mockUserRepository には動作上の期待が確立されており、最終的にその動作の期待が検証されているためです。素晴らしいですが、mockUserRepository がその Stub() メソッドを呼び出して、同じオブジェクトの GetUserByName() の呼び出しによって返されたデータを「使用できる」ようにしています。
明らかに、この例は、明示的に名前が付けられ、宣言されたモックをモックとスタブの両方として使用することを示しています。Roy Osherove の定義に戻ると、すべての偽物は主張するまではスタブであり、偽物をモックとスタブの両方として (確かに機能しますが) 使用することは悪い習慣であると私は信じざるを得ません。
これを行うことに評決があるかどうかは誰にもわかりませんか?