通过控制器使用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());
    }

更新:更清楚地表明,我想测试控制器是否返回具有特定标头的响应。

通过控制器使用ExecuteAsync测试IHttpActionResult

根据提供的代码,我只测试AcceptedResult类的ExecuteAsync方法是否返回包含正确标头的响应,因为应该总是这样。

控制器测试方法只需要验证结果是否与AcceptedResult类型匹配。