我只想问一下在我的单元测试中提供这些对象的更好的方法是什么。
在单元测试中,我测试的是CSLA对象。CSLA对象在内部使用ApplicationUser对象的一个属性和一个方法。ApplicationUser是从IPrincipal继承的。属性是: 1) ApplicationContext.User.IsInRole(...) -该方法是IPrincipal的一部分2) ApplicationContext.User.Identity.Name -名称是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
}
}我对第二个值--身份名称--有一点问题。我试图模拟它,但在将模拟的IIdentity赋值给ApplicationUser时遇到了问题,因为它是在内部完成的。我被告知只需要自己创建一些IIPrincipal (包括IIdentity),而不是完全模仿它。这是肯定可以做到的。不确定这是否可以被称为存根,使用?
那么你能建议我如何处理IPrincipal和IIdentity吗?任何最受欢迎的建议。
发布于 2009-07-07 17:54:00
出现null引用错误的原因是因为IPrincipal.Identity为null;在模拟的IPrincipal中还没有设置它。在空Identity中调用.Name会导致异常。
正如Carlton所指出的,答案是也模拟IIdentity,并将其设置为为其Name属性返回"ju“。然后,您可以告诉IPrincipal.Identity返回模拟IIdentity。
下面是您的代码的扩展(使用Rhino Mock而不是Stub):
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);
}
}发布于 2008-10-02 14:39:48
下面是我用来返回测试用户的代码(使用存根):
[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)即可。
https://stackoverflow.com/questions/162534
复制相似问题