0

我正在将一个项目移植到 ASP.Net 6 的新最小 api

现在我有类似的东西:

builder.MapGet("/hello", CiaoCiao);

IResult CiaoCiao()
{
    return Results.Ok("Ciao ciao!");
}

在单独的函数中实现端点的原因是我想为它编写一个单元测试。但我有以下问题:

如何从 中获取响应值(在本例中为字符串"Ciao ciao!"IResult

到目前为止,我在官方文档中没有找到任何关于此的内容。有一门Microsoft.AspNetCore.Http.Result.OkObjectResult我可以投到的课。但这是内部的AspNetCore,因此无法从我的单元测试项目中访问它。

4

2 回答 2

3

这在 ASP.NET Core 6 中是不可能的,因为所有的实现IResult都是内部的。

计划作为 ASP.NET Core 7 的一部分进行改进。

WebApplicationFactory<T>通过 HTTP 接口集成测试您的代码将是使用 ASP.NET Core 6 使用类 ( docs )测试应用程序端点的一种方法。

于 2022-03-02T12:56:08.913 回答
0

我能够使用Martin Costello在他的回答中链接的github问题中的一些代码提出一种解决方法:

private static async Task<T?> GetResponseValue<T>(IResult result)
{
    var mockHttpContext = new DefaultHttpContext
    {
        // RequestServices needs to be set so the IResult implementation can log.
        RequestServices = new ServiceCollection().AddLogging().BuildServiceProvider(),
        Response =
        {
            // The default response body is Stream.Null which throws away anything that is written to it.
            Body = new MemoryStream(),
        },
    };

    await result.ExecuteAsync(mockHttpContext);

    // Reset MemoryStream to start so we can read the response.
    mockHttpContext.Response.Body.Position = 0;
    var jsonOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web);
    return await JsonSerializer.DeserializeAsync<T>(mockHttpContext.Response.Body, jsonOptions);
}

丑陋,但似乎工作。

于 2022-03-02T13:11:40.213 回答