我有一个 ASP.NET Core 2.2 Web API,我现在正在为使用 XUnit 创建集成测试。但是,API 使用 Auth0 作为身份验证服务器。它的所有控制器动作都受到 [Authorize] 装饰器的保护。
现在,我只是想在测试中添加一个硬编码的访问令牌(我可以从 Auth0 网站获得),以便测试可以成功地针对 API 进行身份验证并执行其操作。我一直在用 Postman 做同样的事情来测试我的 API,而且效果很好。
所以这是我在一个测试类中的代码:
public class FileControllerTests
{
private readonly HttpClient _client;
private readonly TestServer _server;
public FileControllerTests()
{
_server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
_client = _server.CreateClient();
}
[Theory]
[InlineData("GET")]
public async Task TestFilesAsync(string method)
{
// Arrange
var request = new HttpRequestMessage(new HttpMethod(method), "/api/files");
request.Headers.Add("Authorization", ACCESS_TOKEN);
// Act
var response = await _client.SendAsync(request);
// Assert
response.EnsureSuccessStatusCode();
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
}
当我运行这个测试时,我得到这个错误:
System.Net.Http.HttpRequestException :响应状态代码不表示成功:500(内部服务器错误)。
但是,如果我从 API 的控制器中删除 [Authorize] 装饰器,那么测试工作并通过。有任何想法吗?
我正在使用 Visual Studio Professional 2017(版本 15.9.4)
编辑:而不是:
request.Headers.Add("Authorization", ACCESS_TOKEN);
我也试过
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", ACCESS_TOKEN);
但这并没有什么不同。