В моем проекте все отлично работает, когда я повторяю шаги, описанные в статье, включая тестирование API через Restlet. Однако я пытаюсь использовать для этого проекта разработку через тестирование (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().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.");
}
}
};
}
Код: Выделить всё
Thread.CurrentPrincipal = handler.ValidateToken(token, validationParameters, out securityToken);
HttpContext.Current.User = handler.ValidateToken(token, validationParameters, out securityToken);
Подробнее здесь: https://stackoverflow.com/questions/513 ... th-web-api
Мобильная версия