2008-10-28 27 views

Respuesta

1

¿Su código realmente necesita un usuario conectado a través de ASP.NET, o solo necesita un CurrentPrincipal? No creo que deba iniciar sesión programáticamente en su sitio. Puede crear un GenericPrincipal, establecer las propiedades que necesita y adjuntarlo, por ejemplo, Thread.CurrentPrincipal o un HttpContext falso. Si su código realmente necesita RolePrincipal o algo así, cambiaría el código para que esté menos acoplado a la membresía de ASP.NET.

+0

necesito la llamada a Membership.GetUser() para devolver el usuario actualmente conectado. – ddc0660

+2

No llame a Membership.GetUser() directamente en la clase bajo prueba. Proporcione a la clase un IGetUser en la creación, utilícelo en lugar de Membership.GetUser(), luego realice una implementación simulada de IGetUser para realizar pruebas. –

0

Usando su proveedor de membresía puede validar a un usuario que usa Membership.ValidateUser. Luego puede establecer la cookie de autenticación usando FormsAuthentication.SetAuthCookie. Siempre que tenga un contenedor de cookies, esto debería permitirle iniciar sesión en un usuario.

2

He encontrado que es más conveniente crear una clase desechable que maneje la configuración y restablecimiento de Thread.CurrentPrincipal.

public class TemporaryPrincipal : IDisposable { 
     private readonly IPrincipal _cache; 

     public TemporaryPrincipal(IPrincipal tempPrincipal) { 
      _cache = Thread.CurrentPrincipal; 
      Thread.CurrentPrincipal = tempPrincipal; 
     } 

     public void Dispose() { 
      Thread.CurrentPrincipal = _cache; 
     } 
    } 

En el método de prueba que acaba de envolver su llamada con una instrucción using así:

using (new TemporaryPrincipal(new AnonymousUserPrincipal())) { 
    ClassUnderTest.MethodUnderTest(); 
} 
13
if(Membership.ValidateUser("user1",[email protected])) 
     { 
      FormsAuthentication.SetAuthCookie("user1",true); 
} 
Cuestiones relacionadas