通过控制器使用ExecuteAsync测试IHttpActionResult
本文关键字:ExecuteAsync 测试 IHttpActionResult 控制器 | 更新日期: 2023-09-27 18:29:44
简而言之:在单元测试中,通过控制器测试IHttpActionResult的最佳方法是什么?
给定在ExecuteAsync
方法中具有一些逻辑的自定义IHttpActionResult
public class AcceptedResult : IHttpActionResult
{
private readonly Func<string> _ticket;
public AcceptedResultV2(HttpRequestMessage request, Func<string> ticket)
{
_ticket = ticket;
}
public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage(HttpStatusCode.Accepted);
response.Headers.Add("x-ticket-id", _ticket());
return response;
}
}
以及一种暴露CCD_ 3 的控制器方法
[HttpPost]
public IHttpActionResult Get(SearchScheduledTaskRequest searchScheduledTaskRequest)
{
if(something) return new AcceptedResult(Request, () => "foo");
return new AcceptedResult(Request, () => "bar");
}
测试这一点的最佳方法是什么?
目前,我已经习惯了手动调用ExecuteAsync
,但我不得不总是调用ExecuteAsync
,这有点麻烦。
我当然可以在某个地方提取它,但我想知道是否有更好的方法
[TestMethod]
public async Task Has_Request_Id()
{
var response = await _controller.Get(new SearchScheduledTaskRequest()).ExecuteAsync(CancellationToken.None);
System.Collections.Generic.IEnumerable<string> headers;
response.Headers.TryGetValues("x-request-id", out headers);
Assert.AreEqual("foo", headers.First());
}
更新:更清楚地表明,我想测试控制器是否返回具有特定标头的响应。
根据提供的代码,我只测试AcceptedResult类的ExecuteAsync方法是否返回包含正确标头的响应,因为应该总是这样。
控制器测试方法只需要验证结果是否与AcceptedResult类型匹配。