mocking iprincipal

mocking - Mock IIdentity e IPrincipal



(2)

Solo quiero preguntar cuál sería el mejor enfoque para suministrar estos objetos en mis pruebas unitarias.

En mi prueba de unidad estoy probando el objeto CSLA. El objeto CSLA está usando internamente una propiedad y un método del objeto ApplicationUser. ApplicationUser se hereda de IPrincipal. Las propiedades son: 1) ApplicationContext.User.IsInRole (...) - el método es parte de IPrincipal 2) ApplicationContext.User.Identity.Name - el nombre es propiedad de IIdentity que es parte de ApplicationUser aka IPricipal

Ejemplo de mi prueba (usando 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 } }

Tengo un pequeño problema con el segundo valor, el nombre de identidad. Traté de burlarme, pero tuve problemas para asignar IIdentity burlado a ApplicationUser, ya que se hace internamente. Me dijeron que acabara de crear un IIPrincipal (incluido IIdentity) solo y que no me burlara de él. Que se puede hacer con seguridad. ¿No está seguro de si esto se puede llamar como uso de Stub?

Entonces, ¿me pueden aconsejar cómo lidiar con IPrincipal y IIdentity? Cualquier sugerencia más bienvenida.


Aquí está el código que uso para devolver a un usuario de prueba (usando 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; }

Tengo linq en otro código, así que estoy usando el tipo var para las variables; simplemente sustituya los tipos correctos (IPrincipal, IIdentity) si es necesario.


La razón por la que obtiene un error de referencia nulo es porque IPrincipal.Identity es nulo; aún no se ha establecido en su IPrincipal . Llamar .Name la Identity nula da como resultado su excepción.

La respuesta, como señaló Carlton, es burlarse de IIdentity también , y configurarlo para devolver "ju" para su propiedad Name . Luego puede decirle a IPrincipal.Identity que devuelva el simulador de IIdentity .

Aquí hay una expansión de su código para hacer esto (usando Rhino Mocks en lugar de 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); } }