I just wanna ask what would be better approach to supply these objects in my unit tests.
In my unit test I am testing CSLA object. CSLA object is internally using one pr
The reason you're getting a null reference error is because IPrincipal.Identity
is null; it hasn't been set in your mocked IPrincipal
yet. Calling .Name
the null Identity
results in your exception.
The answer, as Carlton pointed out, is to mock IIdentity
also, and set it up to return "ju" for its Name
property. Then you can tell IPrincipal.Identity
to return the mock IIdentity
.
Here is an expansion of your code to do this (using Rhino Mocks rather than 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);
}
}
Here is the code I use to return a test user (using 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;
}
I've got linq in other code so I'm using the var type for the variables; just substitute the correct types (IPrincipal, IIdentity) if needed.