2008-10-27 20 views
10

Estoy tratando de burlar HttpContext para que pueda probar mi unidad llamada Request.IsAuthenicated de mi controlador. Estoy usando el blog code that I found at Scott Hanselman's para simular HttpContext usando rhino.mocks. así que tengo esta pieza de prueba de unidad:Burlarse de HttpContext no funciona

PostsController postsController = new PostsController(postDL); 
mocks.SetFakeControllerContext(postsController); 
Expect.Call(postsController.Request.IsAuthenticated).Return(true); 

En mi acción del controlador, tengo algo así como if(Request.IsAuthenticated).... cuando trato de ejecutar la prueba de la unidad, la prueba falla lanzar una excepción nula, y cuando intento depurar la prueba unitaria, veo que el HttpContext nunca se asigna al controlador. alguna idea?

Respuesta

0

Ahora, para la divulgación, todavía tengo que ensuciarme las manos con la mayoría de las cosas que está trabajando, sin embargo:

Si quiere burlarse de la IsAuthenticated, ¿por qué no crear una clase estática para volver un bool que puede ser manipulado por tu código de prueba?

Esto es un poco peligrosa por las esquinas, pero espero que usted consigue la idea:

interface IAuthenticationChecker 
{ 
    bool IsAuthenticated { get; } 
} 

public class MockAuthenticationChecker : IAuthenticationChecker 
{ 
    static bool _authenticated = false; 

    public static void SetAuthenticated(bool value) 
    { 
     _authenticated = value; 
    } 
    #region IAuthenticationChecker Members 

    public bool IsAuthenticated 
    { 
     get { return _authenticated; } 
    } 

    #endregion 
} 

public class RequestAuthenticationChecker : IAuthenticationChecker 
{ 

    #region IAuthenticationChecker Members 

    public bool IsAuthenticated 
    { 
     get { 
      if (HttpContext.Current == null) 
       throw new ApplicationException(
        "Unable to Retrieve IsAuthenticated for Request becuse there is no current HttpContext."); 

      return HttpContext.Current.Request.IsAuthenticated; 
     } 
    } 

    #endregion 
} 

A continuación, puede utilizar una referencia a ya sea a nivel de aplicaciones, sí que significa que hay que añadir una referencia a la aplicación nivel, y necesita utilizar un ref diferente en lugar de Request, pero también obtiene un control completo sobre la autenticación para probar :)

FYI - esto está totalmente abierto a ser destruido, lo tiré en aproximadamente un minuto :)

2

Esto puede ser de alguna utilidad para usted, trabajó para mí en un escenario similar:

http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx

+0

este es un método de fuerza bruta para cuando usted no tiene HttpContextBase y clases de base abstracta relacionados –

+0

el enlace a la fuente no funciona – Juri

+0

electrónico Try Mailing Phil a través de su sitio - http://haacked.com/contact.aspx – Kieron

8

esto debería funcionar:

PostsController postsController = new PostsController(postDL); 
var context = mocks.Stub<HttpContextBase>(); 
var request = mocks.Stub<HttpRequestBase>(); 
SetupResult.For(request.IsAuthenticated).Return(true); 
SetupResult.For(context.Request).Return(request);  
postsController.ControllerContext = new ControllerContext(context, new RouteData(), postsController); 
0

Aquí hay una manera simple de simular el contexto, encontrado desde Jeff's blog:

 TextWriter tw = new StringWriter(); 
     HttpWorkerRequest wr = new SimpleWorkerRequest("/webapp", "c:\\inetpub\\wwwroot\\webapp\\", "default.aspx", "", tw); 
     HttpContext.Current = new HttpContext(wr); 
Cuestiones relacionadas