测试具有授权过滤器的Web API操作

时间:2012-09-05 13:17:39

标签: unit-testing asp.net-web-api dotnet-httpclient

我有一个Web API,我已经添加了[Authorize]属性,这意味着我以前的单元测试现在因为未经授权而失败。以下是基本测试的示例以及初始化方法:

[TestInitialize]
public void CreateServer() {
    var config = new HttpConfiguration();
    WebApiConfig.Configure(config); // Create the routes
    var server = new HttpServer(config);
    this.client = new HttpClient(server);
}

[TestMethod]
public void MyThings_GET_Returns_All_MyThings() {
    var response = this.client.GetAsync("http://localhost/api/1.0/mythings").Result;

    var mythings = response.Content.ReadAsAsync<IEnumerable<MyThing>>().Result;

    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
    Assert.AreEqual(4, mythings.Count());
}

我想知道的是,是否有任何方法可以让我的测试登录,以便它通过授权过滤器,或者是否有任何方式可以作为ASPXAUTH cookie和HttpClient请求传递?还是另一种传递授权的方式,我没有想过?

我尝试过的任何东西似乎都无法工作,我很难在任何地方找到任何有用的信息。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您的Authorize属性在执行授权检查时会执行哪些操作?我想到了很多选择:

  • 让授权过滤器支持多种获取所需“授权令牌”的方法(例如通过HTTP标头或查询字符串参数等)
  • 在测试初始化​​之后,从配置中清除过滤器(以便根本不调用它)。如果您选择这条路线,那么您可能希望弹出一个新的过滤器,设置可能在管道中进一步使用的任何授权值
  • 如果您正在使用依赖注入,请将“授权检查”移动到可在您的配置中更新的某种IAuthorize位置

我还建议使用RestSharp对端点进行查询,因为它可以很好地指定标头,参数等。

答案 1 :(得分:0)

我认为我解决这个问题的方式根本就是错误的。在Web API中使用基于cookie的授权并不是一个好主意,因此我决定取消授权属性并执行基于API密钥的身份验证。这使得测试更容易,因为我可以在请求中传递正确的API密钥,但也意味着我不依赖cookie进行授权。