单元测试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>();
答
可以断言使用返回的视图的名称?
这不会给你的格式,但会让你测试返回的视图。
答
它取决于使用ActionResult的请求。当FormatResult的ExecuteResult方法运行时,会发生此逻辑。解决这个问题的最好方法是重构FormatResult类,以便在不执行它的情况下获取所选的ActionResult。拉请求欢迎:)
因为它的立场唯一的方法来测试这将是运行ExecuteResult方法并检查结果。
我不能得到的ViewResult实例 – Sly 2011-12-16 14:02:29