2008-10-27 18 views
10

Próbuję wyśmiewać HttpContext, dzięki czemu mogę jednostce przetestować żądanie Request.IsAuthenicated mojego kontrolera. Używam bloga code that I found at Scott Hanselman's do symulacji HttpContext za pomocą rhino.mocks. więc mam ten kawałek testów jednostkowych:Kpiny HttpContext nie działa

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

W mojej działania kontrolera, mam coś if(Request.IsAuthenticated).... gdy próbuję uruchomić test jednostki, test nie powiedzie się wyrzuceniem wyjątku null, a gdy próbuję debugowanie testu jednostkowego, widzę, że HttpContext nigdy nie jest przypisany do kontrolera. jakieś pomysły?

Odpowiedz

0

Teraz ujawniania, mam jeszcze dostać w swoje ręce brudne z większość rzeczy, na którym pracujemy, ale:

Jeśli chcesz mock IsAuthenticated, dlaczego nie wystarczy utworzyć klasę statyczną, aby powrócić bool, który może być manipulowany przez twój kod testowy?

To nieco szorstkie wokół krawędzi, ale mam nadzieję, że masz pomysł:

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 
} 

Następnie można użyć odwołania albo na poziomie aplikacji, tak, to oznacza, że ​​trzeba dodać odwołanie w aplikacji poziom, i musisz użyć innego ref zamiast żądania, ale masz również pełną kontrolę nad uwierzytelnianiem do testowania :)

FYI - to jest całkowicie otwarte na bycie rozerwanym, rzuciłem to w około minutę :)

8

To powinno działać:

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

Oto jeden prosty sposób na sfałszowanie kontekstu, znalezione to z Jeff's blog:

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