简而言之:在单元测试中通过控制器测试IHttpActionResult的最佳方法是什么?
在IHttpActionResult
方法
ExecuteAsync
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;
}
}
以及公开IHttpActionResult
[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());
}
更新:让我更清楚我想测试控制器是否返回带有特定标头的响应。
答案 0 :(得分:0)
根据提供的代码,我只是测试 AcceptedResult 类的 ExecuteAsync 方法是否返回包含正确标头的响应,因为这应该始终是这样的。
您的控制器测试方法只需验证结果是否与 AcceptedResult 类型匹配。