2008-09-16 5 views
12

私はRhinoMocksを初めて使い、フードの下で何が起こっているかに加えて構文を把握しようとしています。RhinoMocks:プロパティゲッターをモックする正しい方法

私はユーザーオブジェクトを持っています。これはUserという名前で、IsAdministratorというプロパティがあります。 IsAdministratorの値は、ユーザーのセキュリティアクセス許可をチェックする別のクラスによって評価され、それらのアクセス許可に基づいてtrueまたはfalseが返されます。私はこのUserクラスを模擬しようとしており、Unit Testsを分離するためにIsAdministratorの戻り値を偽装しています。

public void CreateSomethingIfUserHasAdminPermissions() 
{ 
    User user = _mocks.StrictMock<User>(); 
    SetupResult.For(user.IsAdministrator).Return(true); 

    // do something with my User object 
} 

を今、私はRhinoはプロパティのゲッターへの「偽」コールを行くと、ちょうど私にtrueを返すされていることを期待してい:

は、これは私がこれまでやっているものです。これは間違っていますか?現在、IsAdministratorプロパティの依存関係のために例外が発生しています。

ここで目標を達成する方法を説明できる人はいますか?

答えて

11

一つの簡単なメモを_mocks.ReplayAllを呼び出してください。通常は、「厳格な」モックの使用を避けたいのは、脆弱なテストのためです。 Rhinoに明示的に伝えていないことが起こった場合、厳密な疑似命令は例外をスローします。また、モックを作成するために電話をかけるときにRhinoが何をしているのか誤解していると思います。定義したSystem.Typeから派生した、または実装したカスタムオブジェクトと考えることができます。 IsAdministratorは、おそらくあなたは継承型では、それを上書きすることはできませんユーザータイプでちょうど公共財産であるので

public class FakeUserType: User 
{ 
    //overriding code here 
} 

:あなたはそれを自分でやった場合、それは次のようになります。

あなたの質問に関しては、これを処理する方法がいくつかあります。あなたは次のように述べたaaronjensenとして、ユーザークラスに仮想プロパティとしてIsAdministratorを実現することができます。

public class User 
{ 
    public virtual Boolean IsAdministrator { get; set; } 
} 

これはOKなアプローチですが、あなたはUserクラスから継承することを計画している場合のみ。また、このクラスの他のメンバーを偽造することをやめようとしなければ、仮想でなければなりません。これはおそらく望ましい動作ではありません。

これを達成する別の方法は、インターフェイスの使用によるものです。それが本当にUserクラスであれば、Mockを使いたいと思っています。それからインターフェースを抽出します。あなたの上記の例は次のようになります。

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 
} 

あなたがdependency injection and IOCを使用して欲しいが、基本的な原理は軒並み同じである場合は、手の込んだ得ることができます。通常、あなたのクラスは、とにかく具体的な実装ではなく、インタフェースに依存するようにします。

こちらがお役に立てば幸いです。私は主要なプロジェクトで長い間RhinoMockを使用してきましたので、TDDと嘲笑について私に質問するのをためらってください。

+1

最後の例では、IUserスタブを使用する前に '_mocks.ReplayAll()'が必要であることに注意してください。 –

1

IsAdministratorが仮想であることを確認してください。

また、私はこれに飛び込む前に、あなたは)(

0

_mocks.ReplayAll()は何も行いません。カウントされないSetupResult.For()を使用しているからです。 Expect.Call()を使用して、コードがすべて正しいことを確認します。

関連する問題