Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试使用UrlHelper测试控制器_C#_Unit Testing_Xunit_Asp.net Core Mvc 2.0 - Fatal编程技术网

C# 尝试使用UrlHelper测试控制器

C# 尝试使用UrlHelper测试控制器,c#,unit-testing,xunit,asp.net-core-mvc-2.0,C#,Unit Testing,Xunit,Asp.net Core Mvc 2.0,尝试创建用于测试目的的URLHelper会引发NullReferenceException 例如: [Fact] public async void AuthenticateAsyncTest() { // Arrange var controller = new Controller(serviceProvider) { Url = new UrlHelper(new ActionContext()) // Exception thrown }; // Act

尝试创建用于测试目的的
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:对象引用未设置为 对象的实例

Exception.StackTrace:

UrlHelperBase.ctor(ActionContext ActionContext) ControllerUnitTest.AuthenticateTasynctTest()

使用:

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=newurlhelper(newactioncontext())
  • 运行测试
  • 应该是这样的:

    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());
            }
        }
    }
    
    我的问题是:

  • 是否存在错误,或者为什么不起作用
  • 参考文献或链接是否受欢迎
  • 根据异常消息所引用的

    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:

    ActionContext很可能缺少控制器的某些assign dependencyUrl属性<代码>新控制器(){Url=something}又名对象初始值设定项。您需要实际的帮助程序吗?还是只需模仿它就可以了?显示您在测试中实际要实现的目标,清楚地显示正在测试的代码。@SyntaxError Url是名称,因为这是初始化新类的过程,您可以在类中设置变量。这就是为什么你需要{}并使用no;最后在那里。这是一个公共的iurlhelperurl{get;set;}非常感谢您,这似乎可以解决问题。但我对以下事实感到困惑:对于Url=newurlhelper(newactioncontext());不起作用,因为ActionContext()的描述是:“摘要:创建一个空的Microsoft.AspNetCore.Mvc.ActionContext。备注:提供的默认构造函数仅用于单元测试目的。”根据默认,构造函数仅设置模型状态。其他的一切都是默认的。我认为它应该可以工作,因为它在MVCCore1.1中工作。再次感谢你的帮助。