Mock IIdentity and IPrincipal



我只想问在单元测试中提供这些对象的更好方法是什么。

在我的单元测试中,我正在测试CSLA对象。CSLA对象在内部使用ApplicationUser对象的一个属性和一个方法。ApplicationUser继承自IPrincipal。属性为:1) ApplicationContext.User.IsInRole(…)-该方法是IPrincipal的一部分2) ApplicationContext.User.Identity.Name-名称是IIdentity的属性,IIdentity是ApplicationUser(又名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
   }
}

我对第二个值,身份名称有点小问题。我试着模拟它,但在将模拟的IIidentity分配给ApplicationUser时遇到了问题,因为它是内部完成的。我被告知要自己创建一些IIPrincipal(包括IIdentity),不要嘲笑它。这是可以肯定的。不确定这是否可以称为Stub使用?

那么你能建议我如何处理IPrincipal和IIdentity吗?欢迎提出任何建议。

获得空引用错误的原因是IPrincipal.Identity为空;它还没有设置在您的模拟CCD_ 2中。在空Identity中调用.Name会导致异常。

正如Carlton所指出的,答案是模拟IIdentity,并设置它为其Name属性返回"ju"。然后您可以告诉IPrincipal.Identity返回模拟IIdentity

以下是您的代码扩展(使用Rhino Mocks而不是Stubs):

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);
   }
}

以下是我用来返回测试用户(使用Stubs)的代码:

    [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)。

相关内容

  • 没有找到相关文章

最新更新