【发布时间】:2018-07-27 10:22:06
【问题描述】:
我有一个向 HttpPost 方法发送请求的单元测试代码。
[Test]
public async Task ValidateToken()
{
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string("test", "test")
};
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
var response = await httpClient.PostAsync("/api/token/1", content);
Assert.AreEqual(HttpStatusCode.Accepted, response.StatusCode);
}
[Route("api/token")]
public class MyController : BaseApiController
{
private readonly HttpRequest httpRequest;
public MyController(IHttpContextAccessor httpContextAccessor)
{
httpRequest = httpContextAccessor.HttpContext.Request;
}
[HttpPost("{count}")]
public async Task<IActionResult> Post(int count)
{
if(httpRequest.ContentLength)
return BadRequest();
else
return Accepted();
var success= await store.SaveLogStreamAsync(httpRequest.Body, count);
return success ? Accepted() : InternalServerError();
}
}
此单元测试总是失败,因为httpRequest.ContentLength 为空。但是,当我在这一行下断点并检查content的ContentLength时,它总是大于0。
var response = await httpClient.PostAsync("/api/token/1", content);
另外,当我在到达 Action 方法之前设置断点时,ContentLength 不再为 0。我在想,发送内容有延迟吗?
编辑:
我发现,在通过单元测试进行测试时,httpRequest.Body 的类型为 MemoryStream 和 httpRequest.ContentLength = null
当从 Postman 发送请求时,httpRequest.Body 的类型为 FrameRequestStream,httpRequest.ContentLength 始终有一个值。
【问题讨论】:
标签: c# unit-testing asynchronous async-await .net-core