单元测试asp.net mvc restful路由FormatResult
本文关键字:路由 FormatResult restful mvc asp net 单元测试 | 更新日期: 2023-09-27 18:18:07
我使用restful路由模块的asp.net mvc和非常高兴。但有一样东西我得不到。例如,我有一个这样的控制器动作:
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();
但是使用rest,我想有一个这样的索引方法:
public ActionResult Index()
{
return RespondTo(format => {
format.Html = () => {
if (Request.IsAjaxRequest())
return PartialView();
return View();
};
format.Json = () => Json(new { });
});
}
确定之前的规范失败了,因为操作结果不是ViewResult类型,而是FormatResult类型。FormatResult本身覆盖返回void的ExecuteResult方法。如果我想验证FormatResult中的操作结果类型和数据,如何对这样的用例进行单元测试?
在rest式路由的未来版本中,这样的代码是可能的:
var formatResult = actionResult as FormatResult;
ActionResult result = formatResult.ExposeResult().Html();
result.ShouldBeOfType<ViewResult>();
是否可以断言使用返回的视图名称?
这不会给你格式,但可以让你测试返回的视图
这取决于使用ActionResult的请求。这个逻辑在运行FormatResult的ExecuteResult方法时发生。解决这个问题的最佳方法是重构FormatResult类,这样您就可以在不执行它的情况下获得所选的ActionResult。欢迎拉取请求:)
目前唯一的测试方法是运行ExecuteResult方法并检查结果。