1

我有一个 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);

但这并没有什么不同。

4

0 回答 0