Pregunta

Soy nuevo en RhinoMocks y estoy tratando de comprender la sintaxis además de lo que sucede bajo el capó.

Tengo un objeto de usuario, lo llamaremos Usuario, que tiene una propiedad llamada IsAdministrator.El valor de IsAdministrator se evalúa mediante otra clase que verifica los permisos de seguridad del usuario y devuelve verdadero o falso según esos permisos.Estoy intentando burlarme de esta clase de Usuario y falsificar el valor de retorno de IsAdministrator para aislar algunas pruebas unitarias.

Esto es lo que estoy haciendo hasta ahora:

public void CreateSomethingIfUserHasAdminPermissions()
{
    User user = _mocks.StrictMock<User>();
    SetupResult.For(user.IsAdministrator).Return(true);

    // do something with my User object
} 

Ahora, espero que Rhino "falsifique" la llamada al captador de propiedades y simplemente me devuelva la verdad.¿Es esto incorrecto?Actualmente recibo una excepción debido a dependencias en la propiedad IsAdministrator.

¿Alguien puede explicar cómo puedo lograr mi objetivo aquí?

¿Fue útil?

Solución

Una nota rápida antes de entrar en esto.Por lo general, desea evitar el uso de una simulación "estricta" porque resulta una prueba frágil.Una simulación estricta generará una excepción si ocurre algo que usted no le dice explícitamente a Rhino que sucederá.También creo que es posible que no entiendas exactamente qué hace Rhino cuando realizas una llamada para crear un simulacro.Piense en ello como un objeto personalizado que se deriva o implementa el System.Type que definió.Si lo hicieras tú mismo, se vería así:

public class FakeUserType: User
{
    //overriding code here
}

Dado que IsAdministrator es probablemente solo una propiedad pública en el tipo de Usuario, no puede anularla en el tipo heredado.

En lo que respecta a su pregunta, hay varias formas de manejar esto.Podrías implementar IsAdministrator como una propiedad virtual en tu clase de usuario como aaronjensen mencionado de la siguiente manera:

public class User
{
    public virtual Boolean IsAdministrator { get; set; }
}

Este es un buen enfoque, pero sólo si planeas heredar de tu clase Usuario.Además, si no quieres falsificar a otros miembros de esta clase, también tendrán que ser virtuales, lo que probablemente no sea el comportamiento deseado.

Otra forma de lograr esto es mediante el uso de interfaces.Si realmente desea simular la clase Usuario, entonces extraería una interfaz de ella.Su ejemplo anterior se vería así:

public interface IUser
{
    Boolean IsAdministrator { get; }
}

public class User : IUser
{
    private UserSecurity _userSecurity = new UserSecurity();

    public Boolean IsAdministrator
    {
        get { return _userSecurity.HasAccess("AdminPermissions"); }
    }
}

public void CreateSomethingIfUserHasAdminPermissions()
{
    IUser user = _mocks.StrictMock<IUser>();
    SetupResult.For(user.IsAdministrator).Return(true);

    // do something with my User object
}

Puedes volverte más elegante si quieres usando inyección de dependencia y COI pero el principio básico es el mismo en todos los ámbitos.De todos modos, normalmente desea que sus clases dependan de interfaces en lugar de implementaciones concretas.

Espero que esto ayude.He estado usando RhinoMocks durante mucho tiempo en un proyecto importante, así que no dudes en hacerme preguntas sobre TDD y burlas.

Otros consejos

Asegúrese de que IsAdministrator sea virtual.

Además, asegúrese de llamar a _mocks.ReplayAll()

_mocks.ReplayAll() no hará nada.Es solo porque usas SetupResult.For() eso no cuenta.Utilice Expect.Call() para asegurarse de que su código haga todo correctamente.

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