单元测试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中的操作结果类型和数据,如何对这样的用例进行单元测试?

单元测试asp.net mvc restful路由FormatResult

在rest式路由的未来版本中,这样的代码是可能的:

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

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

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

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

目前唯一的测试方法是运行ExecuteResult方法并检查结果。