如何使用单元测试来测试API的身份验证和授权?

时间:2014-02-28 16:49:20

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

一位同事写了一篇HTTP API。他使用实现基本HTTP授权的DelegatingHandler实现了安全性。

他添加了一个路由配置,将BasicAuthHandler应用于全局配置中的API路由:

config.Routes.MapHttpRoute(
    name: "Api",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional },
    constraints: null,
    handler: BasicAuthHandler
);

我写了一个单元测试来测试API调用:

[TestClass]
public class ApiControllerTest
{
  private ApiRepository repo = new ApiTestRepository();

  [TestMethod]
  public void Get()
  {
    // Arrange
    var config = new HttpConfiguration();
    var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/api/driver/1");
    var route = config.Routes.MapHttpRoute("Default", "api/{controller}/{id}");

    ApiDriverController controller = new ApiDriverController(repo)
    {
      Request = request,
    };

    controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;

    // Act
    var Results = controller.Get(1);

    // Assert
    // ...
  }
}

当我使用浏览器调用API时,它确实具有安全性。但是,API测试似乎并不需要它。

API测试是否有效的原因不应该?有没有办法测试安全性?

1 个答案:

答案 0 :(得分:1)

原因是当您通过浏览器测试应用程序时,您的网站在IIS中运行。它是IIS,它创建管道并通过所有处理程序路由请求。

当您对应用程序进行单元测试时,它会在您的单元测试上下文中运行(作为普通程序集)。这意味着没有管道,并且模块没有像在IIS中那样加载。

您唯一能做的就是创建集成测试并从外部测试应用程序