尝试使用 UrlHelper 测试控制器

尝试创建URLHelper用于测试目的的NullReferenceException.


例子:


[Fact]

public async void AuthenticateAsyncTest()

{

  // Arrange

  var controller = new Controller(serviceProvider)

  {

    Url = new UrlHelper(new ActionContext()) // Exception thrown

  };


  // Act

  var result = await controller.Authenticate() as ViewResult;


  // Assert

  Assert.NotNull(result);

}

每次我运行这个测试时,抛出的异常Url = new UrlHelper(new ActionContext())是:

异常消息:

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

异常堆栈跟踪:

UrlHelperBase.ctor(ActionContext actionContext) ControllerUnitTest.AuthenticateAsyncTest()

使用:

xUnit 2.4.1、Microsoft.NETCore.App 2.2.0、Microsoft.AspNetCore.Routing.Abstractions 2.2.0

要重新创建异常:

  1. 创建一个空的 MVC core 2.2 解决方案

  2. 创建一个 xunit 测试项目

  3. 安装 NuGet Microsoft.AspNetCore.Mvc.Core 2.2.0

  4. 在测试中写入: var Url = new UrlHelper(new ActionContext());

  5. 运行测试

应该是这样的:

using Microsoft.AspNetCore.Mvc;

using Microsoft.AspNetCore.Mvc.Routing;

using Xunit;


namespace XUnitTestProject1

{

    public class UnitTest1

    {

        [Fact]

        public void Test1()

        {

            var Url = new UrlHelper(new ActionContext());

        }

    }

}

我的问题:

  1. 是否有错误,或者为什么这不起作用?

  2. 解决方法或链接的文献是否受到赞赏?



开心每一天1111
浏览 134回答 2
2回答

米脂

根据异常消息所指的GitHub源代码,protected UrlHelperBase(ActionContext actionContext){    if (actionContext == null)    {        throw new ArgumentNullException(nameof(actionContext));    }    ActionContext = actionContext;    AmbientValues = actionContext.RouteData.Values;    _routeValueDictionary = new RouteValueDictionary();}助手正在尝试访问actionContext.RouteData.Values原始示例中未提供的内容。为测试流程完成提供必要的依赖项。[Fact]public async Task AuthenticateAsyncTest() {    // Arrange    var httpContext = new DefaultHttpContext();    var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());    var controller = new Controller(serviceProvider) {        Url = new UrlHelper(actionContext)    };    // Act    var result = await controller.Authenticate() as ViewResult;    // Assert    Assert.NotNull(result);}还要避免使用 async void 进行单元测试。改为使用Task。

侃侃无极

第二种选择是使用特定的构造函数。该文档声明它应该用于单元测试,更具体地说,当 ActionContext 只需要传入但不被消费代码使用时。UrlHelper Url = new UrlHelper(new ActionContext { RouteData = new RouteData() });感谢在 githhub 上重播的 navelDirt 和 pranavkm: https ://github.com/aspnet/AspNetCore/issues/6703
打开App,查看更多内容
随时随地看视频慕课网APP