Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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# ASP.NET Core 1.0(ex MVC 6)中的单元测试路由_C#_Asp.net Mvc_Unit Testing_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# ASP.NET Core 1.0(ex MVC 6)中的单元测试路由

C# ASP.NET Core 1.0(ex MVC 6)中的单元测试路由,c#,asp.net-mvc,unit-testing,asp.net-core,asp.net-core-mvc,C#,Asp.net Mvc,Unit Testing,Asp.net Core,Asp.net Core Mvc,随着ASP.NET Core 1.0(ex MVC 6/ASP.NET 5.0)的体系结构发生了重大变化,如何进行路由单元测试 例如,我喜欢这样的库(如x.Index()); 好的。。。我对ASP.NET团队进行了ping,并询问他们如何进行测试 简短回答 你不能在不嘲弄世界的情况下进行单元测试。您必须进行集成/功能测试 稍长的回答 路由可以来自许多地方(属性、预定义路由、区域等),甚至可以通过中间件进行更改。在测试中包含所有这些场景需要建立一些大规模的依赖关系树,同时有一种更简单的方法来测试它

随着ASP.NET Core 1.0(ex MVC 6/ASP.NET 5.0)的体系结构发生了重大变化,如何进行路由单元测试

例如,我喜欢这样的库(如x.Index());
好的。。。我对ASP.NET团队进行了ping,并询问他们如何进行测试

简短回答 你不能在不嘲弄世界的情况下进行单元测试。您必须进行集成/功能测试

稍长的回答 路由可以来自许多地方(属性、预定义路由、区域等),甚至可以通过中间件进行更改。在测试中包含所有这些场景需要建立一些大规模的依赖关系树,同时有一种更简单的方法来测试它

他们是怎么做的。
基本上,他们正在创建一个
TestStartup.cs
,在测试过程中自动托管应用程序,并点击自身查看其行为。它们覆盖了结果,并且。。。差不多就是这样


我想我已经为您提供了所有可能的工具来为您自己实际引导一些东西。

实际上,编写自己的路由测试框架并不难。我在MyTested.AspNetCore.Mvc中实现了路由测试,它运行迅速,没有任何问题-

您可以查看代码,但基本上需要以下内容:

  • 模拟IApplicationBuilder从中提取注册路由
  • 用于传递RouteData的自定义HTTP RouteFeature
  • 自定义ControllerActionInvoker以提取绑定的模型并停止MVC处理该操作
  • 实际准备和执行测试的测试生成器和表达式解析器
  • 考虑到这些步骤,即使是以下测试也能正常工作:

    // action
    public class NormalController : Controller
    {
        [HttpPost]
        public IActionResult UltimateModelBinding(
            ModelBindingModel model, 
            [FromServices]IUrlHelperFactory urlHelper)
        {
            return null;
        }
    }
    
    // model
    public class ModelBindingModel
    {
        [FromBody]
        public RequestModel Body { get; set; }
    
        [FromForm(Name = "MyField")]
        public string Form { get; set; }
    
        [FromQuery(Name = "MyQuery")]
        public string Query { get; set; }
    
        [FromRoute(Name = "id")]
        public int Route { get; set; }
    
        [FromHeader(Name = "MyHeader")]
        public string Header { get; set; }
    }
    
    // unit test
    MyMvc
        .Routes()
        .ShouldMap(request => request
            .WithLocation("/Normal/UltimateModelBinding/100?myQuery=Test")
            .WithMethod(HttpMethod.Post)
            .WithJsonBody(new
            {
                Integer = 1,
                String = "MyBodyValue"
            })
            .WithFormField("MyField", "MyFieldValue")
            .WithHeader("MyHeader", "MyHeaderValue"))
        .To<NormalController>(c => c.UltimateModelBinding(
            new ModelBindingModel
            {
                Body = new RequestModel { Integer = 1, String = "MyBodyValue" },
                Form = "MyFieldValue",
                Route = 100,
                Query = "Test",
                Header = "MyHeaderValue"
            },
            From.Services<IUrlHelperFactory>()));
    
    //操作
    公共类控制器:控制器
    {
    [HttpPost]
    公共IActionResult UltimateModelBinding(
    模型绑定模型模型,
    [FromServices]IUrlHelperFactory urlHelper)
    {
    返回null;
    }
    }
    //模型
    公共类模型绑定模型
    {
    [原文]
    公共请求模型主体{get;set;}
    [FromForm(Name=“MyField”)]
    公共字符串形式{get;set;}
    [FromQuery(Name=“MyQuery”)]
    公共字符串查询{get;set;}
    [FromRoute(Name=“id”)]
    公共int路由{get;set;}
    [FromHeader(Name=“MyHeader”)]
    公共字符串头{get;set;}
    }
    //单元测试
    MyMvc
    .路线(
    .ShouldMap(请求=>request
    .WithLocation(“/Normal/UltimateModelBinding/100?myQuery=Test”)
    .WithMethod(HttpMethod.Post)
    .带JSONBODY(新
    {
    整数=1,
    String=“MyBodyValue”
    })
    .WithFormField(“MyField”、“MyFieldValue”)
    .WithHeader(“MyHeader”、“MyHeaderValue”))
    .To(c=>c.UltimateModelBinding(
    新模型绑定模型
    {
    Body=newrequestmodel{Integer=1,String=“MyBodyValue”},
    Form=“MyFieldValue”,
    路线=100,
    Query=“Test”,
    Header=“MyHeaderValue”
    },
    From.Services());
    

    注意,不要编写这样的操作。

    如果一个请求到达一个特定的操作,那么测试可能更像是一个集成测试,而不是一个单元测试。集成测试的例子:当然,所有的东西都可以通过集成测试来测试,但是使用小型目标单元测试(IMHO)要快得多,更重要的是,它更易于维护。在给定的示例中,您只测试路由,而没有设置HomeController及其所有依赖项。上面链接的库作者的评论:
    // action
    public class NormalController : Controller
    {
        [HttpPost]
        public IActionResult UltimateModelBinding(
            ModelBindingModel model, 
            [FromServices]IUrlHelperFactory urlHelper)
        {
            return null;
        }
    }
    
    // model
    public class ModelBindingModel
    {
        [FromBody]
        public RequestModel Body { get; set; }
    
        [FromForm(Name = "MyField")]
        public string Form { get; set; }
    
        [FromQuery(Name = "MyQuery")]
        public string Query { get; set; }
    
        [FromRoute(Name = "id")]
        public int Route { get; set; }
    
        [FromHeader(Name = "MyHeader")]
        public string Header { get; set; }
    }
    
    // unit test
    MyMvc
        .Routes()
        .ShouldMap(request => request
            .WithLocation("/Normal/UltimateModelBinding/100?myQuery=Test")
            .WithMethod(HttpMethod.Post)
            .WithJsonBody(new
            {
                Integer = 1,
                String = "MyBodyValue"
            })
            .WithFormField("MyField", "MyFieldValue")
            .WithHeader("MyHeader", "MyHeaderValue"))
        .To<NormalController>(c => c.UltimateModelBinding(
            new ModelBindingModel
            {
                Body = new RequestModel { Integer = 1, String = "MyBodyValue" },
                Form = "MyFieldValue",
                Route = 100,
                Query = "Test",
                Header = "MyHeaderValue"
            },
            From.Services<IUrlHelperFactory>()));