通过控制器使用ExecuteAsync测试IHttpActionResult

时间:2016-01-11 10:07:01

标签: c# .net testing asp.net-web-api asp.net-web-api2

简而言之:在单元测试中通过控制器测试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());
    }

更新:让我更清楚我想测试控制器是否返回带有特定标头的响应。

1 个答案:

答案 0 :(得分:0)

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

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