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

时间:2014-07-22 08:49:57

标签: c# unit-testing asp.net-web-api asp.net-web-api-routing

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

  

在路径集合

中找不到名为“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 个答案:

答案 0 :(得分:13)

我得到了同样的错误:

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

但是,在我添加MapHttpAttributeRoutesEnsureInitialized后,单元测试会在我的计算机上传递:

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

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

valuesController.Get();

您是否可以提供更多信息来重现问题或检查我们的测试代码之间是否存在任何差异?

答案 1 :(得分:1)

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

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

请参阅Filip W.在Testing routes in Web API 2

上的精彩解释