joz*_*olo 5 c# tdd unit-testing jwt asp.net-web-api2
我正在尝试使用Web API2,JWT,Microsoft.IdentityModel.JsonWebTokens 5.2.422和本文中概述的令牌验证逻辑:http : //www.decatechlabs.com/secure-webapi-using-jwt
当我重复本文中的步骤(包括通过Restlet测试API)时,一切都对我的项目非常有用。但是,我正在尝试对该项目使用测试驱动开发(TDD),并且理想情况下,我想测试所有工作在我的测试中是否有效,包括令牌验证处理程序。如果我在单元测试中直接调用我的控制器,就可以对其进行测试,但这可以绕过实际的令牌验证处理程序。因此,我尝试使用自托管HTTP正确行使完整的API,包括所有令牌验证处理程序逻辑。这是我获得令牌的完整单元测试,然后将令牌传递给需要授权的第二种方法:
[TestMethod]
public void GetAuthorizedStatus_SelfHostedHTTP()
{
HttpServer server = TestAPIHelper.GenerateTestServer();
using (HttpMessageInvoker client = new HttpMessageInvoker(server))
{
string token = string.Empty;
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, loginURL))
{
var stringContent = new StringContent(JsonConvert.SerializeObject(TestAPIHelper.loginObject), Encoding.UTF8, "application/json");
request.Content = stringContent;
using (HttpResponseMessage response = client.SendAsync(request, System.Threading.CancellationToken.None).Result)
{
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, "Error getting token from login portion");
token = response.Content.ReadAsAsync<string>().Result;
Assert.IsTrue(token.Length > 50);
}
}
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, authorizedStatusURL))
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
using (HttpResponseMessage response = client.SendAsync(request, System.Threading.CancellationToken.None).Result)
{
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode, "Error getting status from Authenticated portion.");
}
}
};
}
Run Code Online (Sandbox Code Playgroud)
问题在于TokenValidationHandler抛出“对象引用未设置为对象的实例”。处理程序的以下两行第二行中的第二个异常,仅当由带有令牌的我的单元测试调用时才如此。如果我使用Restlet / Postman /任何东西触发处理程序,则不会引发任何异常,并且一切正常。
Thread.CurrentPrincipal = handler.ValidateToken(token, validationParameters, out securityToken);
HttpContext.Current.User = handler.ValidateToken(token, validationParameters, out securityToken);
Run Code Online (Sandbox Code Playgroud)
我不明白是什么原因导致当第一行几乎相同的行起作用时,仅导致第二行出错-这两行调用相同的方法。而且我不明白为什么它可以与第三方软件一起使用,但不能与我的测试代码一起使用-我担心的是,如果我不打算将其用于单元测试,那么我将无法使代码适用于真正的应用程序调用此api。我认为这是我的测试代码中的一些琐碎设置,需要在提交前添加到请求中。但是也许我需要设计一种完全不同的方法来在单元测试中调用API。
我不会这样做。
在这种情况下,我所做的是编写涵盖令牌逻辑的集成测试。
这意味着调用令牌端点,检索令牌,然后调用其他内容并查看会发生什么。
然后,您可以添加其他测试,例如令牌丢失、无效、过期或包含错误声明时会发生什么情况。
| 归档时间: |
|
| 查看次数: |
1463 次 |
| 最近记录: |