簡體   English   中英

ASP.NET Core 1.0中的單元測試路由(前MVC 6)

[英]Unit testing routing in ASP.NET Core 1.0 (ex MVC 6)

隨着ASP.NET Core 1.0(前MVC 6 / ASP.NET 5.0)的體系結構發生了重大變化,如何進行單元測試路由?

作為一個例子,我喜歡像這樣的庫(對於<= MVC 5): https//github.com/AnthonySteele/MvcRouteTester

一些流暢的擴展方法:

routes.ShouldMap("/").To<HomeController>(x => x.Index());

好吧......我對ASP.NET團隊進行了ping操作並詢問他們如何進行測試。

簡短的回答

你不能在不嘲笑世界的情況下進行單元測試。 你必須進行集成/功能測試。

答案稍微長一些

路由可以來自許多地方(屬性,預定義的路由,區域等),甚至可以被中間件更改。 在測試中包括所有這些場景需要設置一些大量的依賴樹,同時有一種更簡單的方法來測試它。

他們是如何做到的。

基本上,他們正在創建一個TestStartup.cs ,在測試過程中自我托管應用程序並自行查看它的行為方式。 他們覆蓋了結果......這就是它。

我想我已經給你了所有可能的工具來實際為自己引導一些東西。

實際上,編寫自己的路由測試框架並不是很難。 我在MyTested.AspNetCore.Mvc中實現了路由測試,它運行迅速且沒有任何問題 - https://github.com/ivaylokenov/MyTested.AspNetCore.Mvc

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

  1. 模擬IApplicationBuilder從中提取注冊路由
  2. 自定義HTTP RouteFeature以傳遞RouteData
  3. 自定義ControllerActionInvoker提取綁定模型並阻止MVC處理操作
  4. 測試構建器和表達式解析器以實際准備和執行測試

考慮到這些步驟,即使像下面這樣的測試也能正常工作:

// 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>()));

PS不要寫這樣的動作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM