单元测试asp.net mvc restful routing FormatResult

问题描述:

我对于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中的动作结果类型和数据,我该如何单元测试这种情况?

在宁静的路由这样的代码的未来版本可能:

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

可以断言使用返回的视图的名称?

这不会给你的格式,但会让你测试返回的视图。

+0

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

它取决于使用ActionResult的请求。当FormatResult的ExecuteResult方法运行时,会发生此逻辑。解决这个问题的最好方法是重构FormatResult类,以便在不执行它的情况下获取所选的ActionResult。拉请求欢迎:)

因为它的立场唯一的方法来测试这将是运行ExecuteResult方法并检查结果。