我正在将一个项目移植到新的minimal of ASP.Net 6。
现在我有一个类似的东西:
builder.MapGet("/hello", CiaoCiao);
IResult CiaoCiao()
{
return Results.Ok("Ciao ciao!");
}
将端点实现放在一个单独的函数中的原因是,我想为它编写一个单元测试。但我有以下问题:
如何从"Ciao ciao!"
中获取响应值(在本例中为字符串IResult
)
到目前为止,我还没有在官方文件中找到任何关于这方面的信息。有一个类Microsoft.AspNetCore.Http.Result.OkObjectResult
,我可以投给它。但是这是AspNetCore
的内部特性,所以我的单元测试项目无法访问它。
发布于 2022-03-02 12:56:08
发布于 2022-03-02 13:11:40
我想出了一个解决办法,在他的回答中使用马丁·科斯特洛联合发行的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-11-18 12:02:51
也可以做一些简单的事情,比如:
[Fact]
public void Then_it_returns_bad_request_result() =>
_result.ToString().Should().EndWith("BadRequestObjectResult");
这并不特别令人满意,但在我找到一个更好的使用.NET7的替代方案之前,我会做这个工作。
https://stackoverflow.com/questions/71323013
复制相似问题