为了账号安全,请及时绑定邮箱和手机立即绑定

尝试使用 UrlHelper 测试控制器

尝试使用 UrlHelper 测试控制器

C#
开心每一天1111 2022-07-23 09:18:02
尝试创建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要重新创建异常:创建一个空的 MVC core 2.2 解决方案创建一个 xunit 测试项目安装 NuGet Microsoft.AspNetCore.Mvc.Core 2.2.0在测试中写入: var Url = new UrlHelper(new ActionContext());运行测试应该是这样的: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());        }    }}我的问题:是否有错误,或者为什么这不起作用?解决方法或链接的文献是否受到赞赏?
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

根据异常消息所指的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。


查看完整回答
反对 回复 2022-07-23
?
侃侃无极

TA贡献2051条经验 获得超10个赞

第二种选择是使用特定的构造函数。该文档声明它应该用于单元测试,更具体地说,当 ActionContext 只需要传入但不被消费代码使用时。

UrlHelper Url = new UrlHelper(new ActionContext { RouteData = new RouteData() });

感谢在 githhub 上重播的 navelDirt 和 pranavkm: https ://github.com/aspnet/AspNetCore/issues/6703


查看完整回答
反对 回复 2022-07-23
  • 2 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信