Pregunta

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á utilizando 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 forma 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. Intenté burlarme, pero tengo problemas para asignar la identidad simulada a ApplicationUser, ya que se realiza internamente. Me pidieron que creara solo un IIPrincipal (incluida la identidad) y que no me burlara en absoluto. Lo que se puede hacer con seguridad. ¿No estoy seguro de si esto se puede llamar como Stub usando?

Entonces, ¿me pueden aconsejar cómo tratar con IPrincipal y la identidad? Cualquier sugerencia muy bienvenida.

¿Fue útil?

Solución

El motivo por el que obtiene un error de referencia nulo es porque IPrincipal.Identity es nulo; aún no se ha establecido en su IPrincipal simulado. Al llamar a .Name el nulo Identity da como resultado su excepción.

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

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

Otros consejos

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top