10

単体テストでこれらのオブジェクトを提供するためのより良いアプローチは何かを尋ねたいだけです。

私の単体テストでは、CSLAオブジェクトをテストしています。CSLAオブジェクトは、内部でApplicationUserオブジェクトの1つのプロパティと1つのメソッドを使用しています。ApplicationUserはIPrincipalから継承されます。プロパティは次のとおりです。1)ApplicationContext.User.IsInRole(...)-メソッドはIPrincipalの一部です2)ApplicationContext.User.Identity.Name-名前はApplicationUserの一部であるIIdentityのプロパティです別名IPricipal

私のテストの例(RhinoMockを使用):

public void BeforeTest()
{
   mocks = new MockRepository();
   IPrincipal mockPrincipal = mocks.CreateMock<IPrincipal>();
   ApplicationContext.User = mockPrincipal;
   using (mocks.Record()) {
      Expect.Call(mockPrincipal.IsInRole(Roles.ROLE_MAN_PERSON)).Return(true);
      Expect.Call(mockPrincipal.Identity.Name).Return("ju"); //doesn't work!!!! return null ref exc
   }
}

2番目の値であるID名に少し問題があります。私はそれをモックしようとしましたが、内部で行われるため、モックされたIIdentityをApplicationUserに割り当てるのに問題があります。IIPrincipal(IIdentityを含む)を自分で作成するだけで、モックを作成しないように言われました。これは確かに行うことができます。これを使用してスタブとして呼び出すことができるかどうかわかりませんか?

では、IPrincipalとIIdentityの扱い方を教えていただけますか?どんな提案でも大歓迎です。

4

2 に答える 2

10

null参照エラーが発生する理由は、IPrincipal.Identityがnullであるためです。まだモックに設定されてIPrincipalいません。.Namenullを呼び出すIdentityと、例外が発生します。

カールトンが指摘したように、答えは、モックIIdentity Name作成し、そのプロパティの「ju」を返すように設定することです。IPrincipal.Identity次に、モックを返すように指示できますIIdentity

これを行うためのコードの拡張は次のとおりです(スタブではなくRhinoモックを使用)。

public void BeforeTest()
{
   mocks = new MockRepository();
   IPrincipal mockPrincipal = mocks.CreateMock<IPrincipal>();
   IIdentity mockIdentity = mocks.CreateMock<IIdentity>();
   ApplicationContext.User = mockPrincipal;
   using (mocks.Record()) 
   {
      Expect.Call(mockPrincipal.IsInRole(Roles.ROLE_MAN_PERSON)).Return(true);
      Expect.Call(mockIdentity.Name).Return("ju"); 
      Expect.Call(mockPrincipal.Identity).Return(mockIdentity);
   }
}
于 2009-07-07T17:53:59.697 に答える
4

テストユーザーを返すために使用するコードは次のとおりです(スタブを使用)。

    [SetUp]
    public void Setup()
    {
        var identity = MockRepository.GenerateStub<IIdentity>();
        identity.Stub(p => p.Name).Return("TestUser").Repeat.Any();
        var principal = MockRepository.GenerateStub<IPrincipal>();
        principal.Stub(p => p.Identity).Return(identity).Repeat.Any();

        Thread.CurrentPrincipal = principal;
    }

他のコードにlinqがあるので、変数にvarタイプを使用しています。必要に応じて、正しいタイプ(IPrincipal、IIdentity)に置き換えてください。

于 2008-10-02T14:39:48.363 に答える