【发布时间】:2020-10-31 21:55:28
【问题描述】:
我有一个 .NET Core 2.2 API 控制器方法,它返回 FileContentResult,如下所示:
[HttpGet]
public async Task<IActionResult> Get()
{
return File(_service.GetCsvFile(), "text/csv", "results.csv");
}
另外,我有一个使用 WebHostFixture 和 httpClient 来获取结果的集成测试。但是,无论我尝试什么方法,内容总是空的。虽然有一个内容被返回的文件:
var response = await WebHost.Client.GetAsync(url, HttpCompletionOption.ResponseContentRead);
var result = await response.Content.ReadAsByteArrayAsync();
此外,当我执行以下操作时,不会读取任何内容:
var response = await WebHost.Client.GetByteArrayAsync(url);
使用此 WebHostFixture 的所有其他集成测试都运行成功,因此这似乎是我的测试环境中唯一未正确返回其数据的端点。当我使用Postman 调用端点时,会正确返回一个包含内容的 CSV 文件。
另外,在 Postman 中,除了接收 body 中的二进制数据外,还返回以下 headers:
但是,在我的测试方法中,调用 GetAsync 方法后,
response.Content.Headers.ContentType 是 "text/csv",但 response.Content.Headers.ContentLength 是 0。
我做错了什么,为什么这里没有返回二进制数据?
【问题讨论】:
-
您是否尝试过调试测试并设置断点?
-
当然,在控制器方法中,一个适当的 FileContentResult 与数据一起返回,在测试中结果是一个空字节[]。
-
在阅读内容前使用
await。喜欢:var result = await response.Content.ReadAsByteArrayAsync(); -
你检查你的响应在HttpResponseMessage中是否有成功状态码?
-
你能编辑和发布你的 WebHostFixture 是怎样的吗?
标签: c# api .net-core integration-testing