单元测试WEB API控制器

时间:2014-07-22 15:56:27

标签: unit-testing asp.net-web-api routes

我有一个webapi控制器,我正在尝试进行单元测试。但是我正在努力解决不同类型的ControllerContext。我看到的大多数代码示例都与测试MVC控制器而不是Web API控制器有关。

控制器定义为:

public class OrdersController : ApiController
{

我有这个代码,当我运行应用程序

uri = Url.Route("DefaultRoute", new { httproute = true, Id = order.Id});

但是,当我尝试将其作为单元测试运行时,它会失败。我已经调试它并且在运行单元测试时发现Url为null,而如果我正常运行系统,则Url是System.Web.Http.Routing.UrlHelper类型的对象。

知道如何在运行单元测试时让Url.Route()工作吗?

1 个答案:

答案 0 :(得分:1)

对于 Web API 2 中的单元测试,更简单的选择是为您的控制器实例提供UrlHelper的Mock版本。此示例使用Moq

        var mockUrlHelper = new Mock<UrlHelper>();    
        ordersCtrl.Url = mockUrlHelper.Object;

如果您使用的是更高版本的web api,则必须使用RouteData在测试中填充控制器。此示例取自asp.net website

 controller.Configuration = new HttpConfiguration();
 controller.Configuration.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional });

 controller.RequestContext.RouteData = new HttpRouteData(
    route: new HttpRoute(),
    values: new HttpRouteValueDictionary { { "controller", "products" } });