ASP.NET MVC 控制器单元测试 - UrlHelper 扩展问题

2024-02-12

尝试做一些控制器在我的 ASP.NET MVC 3 Web 应用程序中进行单元测试。

我的测试是这样的:

[TestMethod]
public void Ensure_CreateReviewHttpPostAction_RedirectsAppropriately()
{
   // Arrange.
   var newReview = CreateMockReview();

   // Act.
   var result = _controller.Create(newReview) as RedirectResult;

   // Assert.
   Assert.IsNotNull(result, "RedirectResult was not returned");
}

很简单。基本上测试一个[HttpPost]确保它返回一个动作RedirectResult(PRG 模式)。我没有使用RedirectToRouteResult因为没有一个重载支持锚链接。继续。

现在,我正在使用Moq模拟 Http 上下文,包括服务器变量、控制器上下文、会话等。到目前为止一切进展顺利。

直到我在我的操作方法中遇到这一行:

return Redirect(Url.LandingPageWithAnchor(someObject.Uri, review.Uri);

LandingPageWithAnchor是一个自定义 HTML 帮助器:

public static string LandingPageWithAnchor(this UrlHelper helper, string uri1, string uri2)
{
   const string urlFormat = "{0}#{1}";

   return string.Format(urlFormat,
                helper.RouteUrl("Landing_Page", new { uri = uri1}),
                uri2);
}

基本上,我重定向到另一个页面,该页面是新内容的“登陆页面”,并在新评论上锚定。凉爽的。

现在,这个方法之前失败了,因为UrlHelper为空。

所以我在嘲笑中这样做了:

controller.Url = new UrlHelper(fakeRequestContext);

这更进一步,但现在失败了,因为路由表不包含“Landing_Page”的定义。

所以我知道我需要嘲笑“某事”,但我不确定它是否是:

a) 路由表
b) UrlHelper.RouteUrl 方法
c) 我写的UrlHelper.LandingPageWithAnchor扩展方法

有人可以提供一些指导吗?

EDIT

这条特定的路线位于Area,所以我尝试在单元测试中调用区域注册:

AreaRegistration.RegisterAllAreas();

但我得到一个InvalidOperationException:

在应用程序的预启动初始化阶段不能调用此方法。


通过模拟 HttpContext、RequestContext 和 ControllerContext,注册路由然后创建一个UrlHelper与这些路线。

有点像这样:

public static void SetFakeControllerContext(this Controller controller, HttpContextBase httpContextBase)
{
    var httpContext = httpContextBase ?? FakeHttpContext().Object;
    var requestContext = new RequestContext(httpContext, new RouteData());
    var controllerContext = new ControllerContext(requestContext, controller);
    MvcApplication.RegisterRoutes();
    controller.ControllerContext = controllerContext;
    controller.Url = new UrlHelper(requestContext, RouteTable.Routes);
}

FakeHttpContext()是一个 Moq 助手,它创建所有模拟内容、服务器变量、会话等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC 控制器单元测试 - UrlHelper 扩展问题 的相关文章

随机推荐

  • 使用 OpenMP 的程序崩溃,仅限 x64

    当我在 Release x64 中构建下面的程序时 它会崩溃 所有其他配置都运行良好 是我做错了还是 OpenMP 问题 扎实的解决方法受到高度赞赏 要使用以下代码重现构建项目 控制台应用程序 在 Release x64 配置中使用 ope
  • 可点击的图像视图位置随动画变化 - android

    我有一个包含在RelativeLayout 中的图像视图 单击图像视图时 我使用平移动画为整个relativelayout设置动画以将其向下移动 当我再次单击图像视图 在新位置 时 它应该将其移回原来位置 但事实并非如此 但是 如果我单击图
  • 如何做 git 子模块以及为什么使用 git 子模块

    我找到了一个 GitHub 项目 它使用 git 子模块 git 子模块有什么用 如何创建 git 子模块 它们与子树有何不同 Git 子模块 git 存储库中的子模块就像一个子目录 它本身就是一个单独的 git 存储库 当 git 中有一
  • RESTful WCF 服务中的 PUT 和 DELETE 导致 401 未经授权的错误

    我在 IIS 7 5 中有一个 RESTful Web 服务 它在我们的开发环境中运行得很好 现在我们已经部署到 QA 环境 并且仅在 PUT 和 DELETE 动词上收到 401 错误 我读过很多关于 405 错误的文章 但关于 401
  • Java 字符串到日期时间

    我有一个来自 json 响应的字符串 start 2013 09 18T20 40 00 0000 end 2013 09 18T21 39 00 0000 如何将此字符串转换为 java DateTime 对象 我尝试过使用以下内容 Si
  • javascript 中的正则表达式可删除任何不存在的内容:a-z 0-9 和连字符

    提前致谢 我想要一个正则表达式来删除所有非字母数字和连字符的内容 因此允许使用 A Z 0 9 和 另外 我如何将其应用于 Javascript 中的字符串 再次感谢 var str a23a asd str replace a z0 9
  • 使用 clang 的指令 movq 的操作数无效

    我正在使用movq使用基于 LLVM 的 clang 902 0 39 1 编译器的 Intel Core i5 上的 X86 64 汇编指令 Intel 语法中的简化代码 位于 my asm S 文件中 如下所示 intel syntax
  • gradlew:权限被拒绝

    我尝试从命令行运行 gradlew 但经常遇到以下错误 Brendas MacBook Pro appx android brendalogy gradlew compileDebug stacktrace bash gradlew Per
  • 在调度程序任务中使用removeAll()

    在做新的事情之前 我希望我的调度程序任务从数据库中删除所有条目 执行函数如下所示 public function execute objectManager TYPO3 CMS Core Utility GeneralUtility mak
  • 如何结合callLater和addCallback?

    实在是太崩溃了 希望大家怜悯我 reactor callLater 0 myFunction parameter1 addCallback reactor stop reactor run myFunction返回一个延迟的 我希望我想做什
  • 如何自动弹出键盘?

    我有编辑文本字段 我必须在其中输入密码 但我必须推送此字段 如何在不触摸编辑文本的情况下自动弹出键盘 有一个编辑文本 xml 字段
  • Java:类继承自身

    我知道这是毫无意义的 我只是觉得这很有趣 我想更多地了解当您创建一个继承自身的类时会发生什么 从而导致堆栈溢出崩溃 令人惊奇的是 Java 允许您首先进行这样的构造 我只是猜测 但是 JVM 是否将自身置于无限循环中 试图在实例化该类之前解
  • 如何列出 Google Cloud Platform 项目的所有启用的 API 服务

    我们管理着几十个 GCP 项目 但我一直不知道如何在网站上列出每个项目所有启用的 API 服务 有一种方法可以通过 Cloud Shell 运行控制台命令来完成此操作 gcloud services list 如果我访问https cons
  • 实体框架和 Oracle Db 中的 CLOB 字符串

    我有这个模型 public class Teacher public int TeacherID get set public string Name get set public string Surname get set 当模型首次运
  • .htaccess 用于附加 https://www [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已经搜索了很长一段时间来获得解决方案或对我的查询的提示 但没有找到任何有价值的东西 基本上我的应用程序是受 SSL 保护的 我想要的只是 如果用户尝
  • 具有可排序功能的 jQuery 树视图

    我只是想知道是否有人知道有什么方法可以让 bassistance 树视图插件与 jQuery UI 的可排序插件一起使用 特别是能够将元素从嵌套 ul 拖放到父 ul 或反之亦然 另外两个要求是我能够防止拖放到指定元素上 例如 class
  • 为 Ruby Resolv.getaddress(ip) 设置超时

    我找不到在 Ruby 文档中 http ruby doc org stdlib 1 9 3 libdoc resolv rdoc Resolv html关于如何使用来自 Ruby std 库的 Resolv 类的类方法 getaddress
  • tv4.validate 始终返回 true。即使我的模式无效,即: var == "dummy"

    tv4 validate 将始终返回 true 无论架构是有效的 JSON 还是只是虚拟字符串 我浏览 stackoverflow 查找相关问题 但 banUnknownProperties 对我没有帮助 正如我所说 我什至尝试将架构变量更
  • 使用cmake编译并包含调试信息

    cmake版本2 8 5 我正在尝试使用 cmake 编译我的项目 但是 当我编译时 我认为我没有包含调试cflags 即 ggdb D DEBUG 当我尝试调试时 没有调试信息 CMakeLists txt 文件是否有任何问题 我有 3
  • ASP.NET MVC 控制器单元测试 - UrlHelper 扩展问题

    尝试做一些控制器在我的 ASP NET MVC 3 Web 应用程序中进行单元测试 我的测试是这样的 TestMethod public void Ensure CreateReviewHttpPostAction RedirectsApp