これに飛び込む前に、1 つ簡単な注意事項があります。通常、「Strict」モックの使用は避けたいと考えます。これは、脆弱なテストになるためです。厳密なモックは、Rhino に明示的に通知していないことが発生した場合に例外をスローします。また、モックを作成するために呼び出しを行うときに、Rhino が何をしているのか正確に誤解していると思います。定義した System.Type から派生したか、実装したカスタム オブジェクトと考えてください。自分でやった場合は、次のようになります。
public class FakeUserType: User
{
//overriding code here
}
IsAdministrator はおそらく User 型の単なるパブリック プロパティであるため、継承型でオーバーライドすることはできません。
あなたの質問に関する限り、これを処理する方法は複数あります。aaronjensenが次のように述べているように、 IsAdministratorをユーザー クラスの仮想プロパティとして実装できます。
public class User
{
public virtual Boolean IsAdministrator { get; set; }
}
これは良い方法ですが、 User クラスから継承する予定がある場合に限ります。また、このクラスの他のメンバーを偽造したくない場合は、それらも仮想にする必要がありますが、これはおそらく望ましい動作ではありません。
これを実現するもう 1 つの方法は、インターフェイスを使用することです。モックしたいのが本当に User クラスである場合は、そこからインターフェイスを抽出します。上記の例は次のようになります。
public interface IUser
{
Boolean IsAdministrator { get; }
}
public class User : IUser
{
private UserSecurity _userSecurity = new UserSecurity();
public Boolean IsAdministrator
{
get { return _userSecurity.HasAccess("AdminPermissions"); }
}
}
public void CreateSomethingIfUserHasAdminPermissions()
{
IUser user = _mocks.StrictMock<IUser>();
SetupResult.For(user.IsAdministrator).Return(true);
// do something with my User object
}
必要に応じて、依存性注入と IOCを使用してより洗練されたものにすることができますが、基本原則は全面的に同じです。通常、クラスは具体的な実装ではなくインターフェイスに依存する必要があります。
これが役立つことを願っています。私は主要なプロジェクトで長い間 RhinoMocks を使用してきたので、TDD とモックについて質問することを躊躇しないでください。