2008-10-02 10 views
10

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

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 (utilizando 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 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 yo solo IIPrincipal (incluido IIdentity) 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 puede aconsejar cómo lidiar con IPrincipal y IIdentity? Cualquier sugerencia más bienvenida.

Respuesta

10

La razón por la que obtiene un error de referencia nulo es porque IPrincipal.Identity es nulo; no se ha establecido todavía en su burlado IPrincipal. Si llama al .Name nulo Identity, se producirá la excepción.

La respuesta, como Carlton señaló, es burlarse IIdentitytambién, y configurarlo para volver "ju" por su propiedad Name. A continuación, puede indicar IPrincipal.Identity para devolver el simulacro IIdentity.

Aquí es una expansión de su código para hacer esto (usando burla de Rhino en lugar de Talones):

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

'CreateMock' ya no se utiliza. Use 'StrictMock' o' DynamicMock' en su lugar. – Padhraic

4

Este es el código que utilizo para devolver un usuario de prueba (utilizando códigos auxiliares):

[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.

Cuestiones relacionadas