Aspnetcore: 使用 ActionContext() 创建 UrlHelper 会导致 NullReferenceException

创建于 2019-01-15  ·  3评论  ·  资料来源: dotnet/aspnetcore

描述错误

尝试在 ActionContext() 的帮助下创建用于测试目的的 URLHelper 会引发 NullReferenceException。

再现

重现行为的步骤:

  1. 创建一个空的MVC核心2.2解决方案
  2. 创建一个 xunit 测试项目
  3. 安装 NuGet Microsoft.AspNetCore.Mvc.Core 2.2.0
  4. 在测试中写入: var Url = new UrlHelper(new ActionContext());
  5. 运行测试

预期行为

引发消息:System.NullReferenceException:未将对象引用设置为对象的实例。

附加上下文

错误报告也可以在 StackOverflow 上找到:
https://stackoverflow.com/questions/54199103/trying-to-test-a-controller-with-a-urlhelper

bug

By Design area-mvc

所有3条评论

这里发生的是, UrlHelper试图访问RouteData的财产ActionContext检查它是否有其价值从而导致异常。 要解决此问题,您可以执行以下操作:

var url = new UrlHelper( new ActionContext{ RouteData = new RouteData() } );

该特定构造函数被记录为用于单元测试,更具体地说,当ActionContext只需要传入,但不被消费代码使用时。 按照@navelDirt建议的方式进行设置将是

更进一步,如果您打算对一段代码是否生成特定的 url 进行单元测试,那么使用 stub\mock IUrlHelper会取得更好的成功。 如果您需要验证实际结果,我强烈建议您编写集成测试

非常感谢@navelDirt和@pranavkm。
我很困惑,因为在核心 1.1 中它没有设置 RouteData 就可以工作,但是切换到 2.2 时它崩溃了。 这就是为什么我认为这是一个错误......很抱歉给您带来不便。

此页面是否有帮助?
0 / 5 - 0 等级