Pregunta

Tengo aplicación MVC y estoy trabajando con objetos POCO y prueba de unidad de escritura. El problema es que toda mi prueba falla cuando llegan a esta línea de código Roles.IsUserInRole ( "unUsuario", "papel"). Debería aplicar la nueva interfaz o depósito de roles o ...? Thx

¿Fue útil?

Solución

Yo tenía el mismo problema cuando se trata de burlarse de la funcionalidad Roles.IsUserInRole en mis pruebas de unidad codificados. Mi solución fue crear una nueva clase llamada RoleProvider y una interfaz con el método IsUserInRole que luego se llamó el System.Web.Security.Roles.IsUserInRole:

public class RoleProvider: IRoleProvider
{
    public bool IsUserInRole(IPrincipal userPrincipal)
    {
        return System.Web.Security.Roles.IsUserInRole(userPrincipal.Identity.Name, "User");
    }
}

A continuación, en mi código que llama al método RoleProvider IsUserInRole. Y cuando tenga una interfaz a continuación, puede burlarse de la IRoleProvider en sus pruebas, el ejemplo se muestra aquí es el uso de burla de Rhino:

var roleProvider = MockRepository.GenerateStub<IRoleProvider>();
roleProvider.Expect(rp => rp.IsUserInRole(userPrincipal)).Return(true);

Espero que esto ayude.

Otros consejos

Puede configurar un método personalizado para comprobar las funciones que se comportan de manera diferente en las pruebas, pero yo prefiero tener las pruebas de establecer un contexto que trabajará con los métodos estándar.

http://stephenwalther.com/blog/archive/2008/07/01/asp-net-mvc-tip-12-faking-the-controller-context.aspx

Se podría crear un contenedor de luz con un predicado / Func.

public static Predicate<string> IsUserInRole = role => Roles.IsUserInRole(role);

A continuación, utilice IsUserInRole () en lugar de Roles.IsUserInRole (). En tiempo de ejecución se obtiene el mismo comportamiento. Pero al tiempo de la prueba se puede anular la función de modo que no tiene acceso a la RoleProvider

MyClass.IsUserInRole = role => true;

Si prefiere no tener un public static se podía inyectar el predicado a través de su constructor y almacenarlo como una privada de solo lectura.

class MyClass
{    
    private readonly Predicate<string> IsUserInRole;
    MyClass(Predicate<string> roleChecker) { this.IsUserInRole = roleChecker }
    MyClass() : this(role => Roles.IsUserInRole(role)) { }
}

Si utiliza Moq puede volver una maqueta y luego controlar el valor de retorno y / o verificar el método fue llamado. Y comprobar qué valor del parámetro fue enviado al predicado.

Mock<Predicate<string>> mockRoleChecker = new Mock<Predicate<string>>();
var cut = new MyClass(mockRoleChecker.Object);
var expectedRole = "Admin";
mockRoleChecker.SetReturnsDefault<bool>(true);  // if not specified will return false which is default(bool)

cut.MyMethod();

mockRoleChecker.Verify(x => x(expectedRole), Times.Once());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top