代码之家  ›  专栏  ›  技术社区  ›  user369117

基于属性的路由的单元测试

  •  10
  • user369117  · 技术社区  · 10 年前

    我有一个带有路由属性的控制器。此控制器在单元测试中失败,因为找不到路由:

    在路由集合中找不到名为“Values”的路由

    这是控制器方法:

    [Route("api/values", Name="ApiValues")]
    [HttpGet]
    public HttpResponseMessage Get()
    { 
        urlHelper.Link("ApiValues", new {});
    }
    

    这是我的单元测试:

    var valuesController = new ValuesController()
    {
        Request = new HttpRequestMessage
        {
            RequestUri = new Uri("http://localhost/api/")
        },
        Configuration = new HttpConfiguration()
    };
    
    valuesController.Get();
    

    我还尝试将其添加到单元测试中:

    valuesController.Configuration.MapHttpAttributeRoutes();
    valuesController.Configuration.EnsureInitialized();
    

    但这没有任何帮助。

    2 回复  |  直到 10 年前
        1
  •  15
  •   Feng Zhao    10 年前

    我也犯了同样的错误:

    A route named 'Values' could not be found in the route collection.
    

    但在我添加 MapHttpAttributeRoutes EnsureInitialized :

    var valuesController = new ValuesController()
    {
        Request = new HttpRequestMessage { RequestUri = new Uri("http://localhost/api/") },
        Configuration = new HttpConfiguration()
    };
    
    valuesController.Configuration.MapHttpAttributeRoutes();
    valuesController.Configuration.EnsureInitialized();
    
    valuesController.Get();
    

    您能否提供更多信息来重新解决问题或检查我们的测试代码之间是否存在差异?

        2
  •  2
  •   Aditya Singh    10 年前

    不要在单元测试中直接调用控制器,而是使用Helper方法获取 Controller context Action context 。这将避免使用

    valuesController.Configuration.MapHttpAttributeRoutes();
    valuesController.Configuration.EnsureInitialized();
    

    请参阅Filip W.on的精彩解释 Testing routes in Web API 2