2011-12-16 182 views
4

我對於asp.net mvc使用restful routing module並非常滿意。但我無法得到一件事。例如,我有過這樣的控制器操作:單元測試asp.net mvc restful routing FormatResult

public ActionResult Index() 
{ 
    if (Request.IsAjaxRequest()) 
     return PartialView(); 
    return View(); 
} 

,也沒有問題,寫這樣的規格:

[Subject(typeof(LotsController))] 
public class When_Index_called 
{ 
    static LotsController controller; 

    static ActionResult actionResult; 

    Establish context =() => { 
     controller = mocker.Create<LotsController>(); 
     controller.ControllerContext = Contexts.Controller.Default; 
    }; 

    Because of =() => actionResult = controller.Index(); 

    It should_render_view =() => actionResult.AssertViewRendered().ForViewWithDefaultName(); 

但隨着使用的休息,我想有這樣一個索引方法:

public ActionResult Index() 
{ 
    return RespondTo(format => { 
     format.Html =() => { 
      if (Request.IsAjaxRequest()) 
       return PartialView(); 
      return View(); 
     }; 
     format.Json =() => Json(new { }); 
    }); 
} 

確定以前的規範失敗了,因爲操作結果不是類型ViewResult,它的FormatResult類型。格式結果本身覆蓋返回void的ExecuteResult方法。如果我想驗證FormatResult中的動作結果類型和數據,我該如何單元測試這種情況?

回答

1

在寧靜的路由這樣的代碼的未來版本可能:

var formatResult = actionResult as FormatResult; 
ActionResult result = formatResult.ExposeResult().Html(); 
result.ShouldBeOfType<ViewResult>(); 
0

可以斷言使用返回的視圖的名稱?

這不會給你的格式,但會讓你測試返回的視圖。

+0

我不能得到的ViewResult實例 – Sly 2011-12-16 14:02:29

0

它取決於使用ActionResult的請求。當FormatResult的ExecuteResult方法運行時,會發生此邏輯。解決這個問題的最好方法是重構FormatResult類,以便在不執行它的情況下獲取所選的ActionResult。拉請求歡迎:)

因爲它的立場唯一的方法來測試這將是運行ExecuteResult方法並檢查結果。