2012-06-11 83 views
1

我想測試返回部分視圖的ActionResult。此操作將檢查用戶是否使用IE7或IE8,如果用戶使用IE7或8,則會返回不同的部分。這是因爲我們使用的java腳本與7或8不兼容,所以我們將對待它不同。在單元測試中嘲弄Request.Browser.Type

我遺漏了模型的創建,因爲我想只關注Request.Browser.Type

public ActionResult ActionName(string listing) 
{ 
    if (model.Count > 1 && Request.Browser.Type != "IE8" && Request.Browser.Type != "IE7") 
    { 
     return PartialView("~/Areas/Features/Views/Video/MultiVideo.cshtml", model); 
    } 
    return PartialView("~/Areas/Features/Views/Video/SingleVideo.cshtml", model.FirstOrDefault()); 
} 

最後我想知道兩件事情

  1. 你怎麼能嘲笑Request.Browser.Type如果在所有?
  2. 這是你的控制器內部的好習慣嗎?如果不是什麼解決方案會更好?

我曾嘗試:

var browser = new Mock<HttpContext>(MockBehavior.Strict); browser.Setup(x => x.Request.Browser).Returns("IE9");

回答

4

我回答我自己的問題而寫的問題(我覺得這經常發生對我來說)。但是,我無法在其他任何地方找到很多,所以我想我會分享我的解決方案。

this幫助,這樣的問題,我想出了這個能夠模擬瀏覽器類型

 var request = new Mock<HttpRequestBase>(MockBehavior.Strict); 

     // This line would do the job 
     request.Setup(b => b.Browser.Type).Returns("IE9"); 

     var context = new Mock<HttpContextBase>(); 
     context.SetupGet(c => c.Request).Returns(request.Object); 

     controller.ControllerContext = new ControllerContext(
              context.Object, 
              new RouteData(), 
              controller); 

我依然不確定這是否是一個好主意,或者不是在你的控制器做。任何想法將不勝感激。