不需要转换返回类型的单元测试IHttpActionResult

3

我有一个Web API控制器,其中有一个类似于以下的方法(截去了不相关部分):

Original Answer可以翻译成"最初的回答"。

[HttpGet]
public IHttpActionResult Order(int orderId) {
    // ...
    var response = new OrderResponse {
        Data = orderData,
        Message = message,
    };
    return Json(response);
}

我有一个测试,它对预期的JsonResult<OrderResponse>.Content值做出了断言。
由于接口IHttpActionResult没有声明Content,所以我目前在单元测试中将结果转换为JsonResult。然而,这需要我的测试知道返回在我的控制器中是如何实现的,并且如果响应实现发生更改,我希望实现更松散的耦合,以便我的测试不会出错。
[TestCase(-1, "The requested order (-1) was not found.")]
public void Test_Returns_NotFound_For_NonExistent_OrderId(int orderId, string expected) {
    var sut = new OrderController()
    // ...
    var result = sut.Order(orderId);

    // I am doing this to get access to `Content`:
    var materializedResult = result as JsonResult<OrderResponse>;

    expected.Should().BeEquivalentTo(materializedResult.Content.Message)
}

2
如果你不测试控制器的实际响应类型,那你在测试什么呢? - undefined
也许你可以改用IActionResult,因为大多数常见的结果都是通过这个接口返回的。 - undefined
2个回答

3
简而言之?只使用接口上可用的方法!最初的回答。
  var controller = new ValuesController();
  controller.Configuration = new System.Web.Http.HttpConfiguration();
  controller.Request = new System.Net.Http.HttpRequestMessage();
  var result = controller.Get(1);

  var response = result.ExecuteAsync(new System.Threading.CancellationToken());
  String deserialized = response.Result.Content.ReadAsStringAsync().Result;
  Assert.AreEqual("\"value\"", deserialized);

IHttpActionResult 只包含一个方法——ExecuteAsync。所以调用它!它会返回一个包含你要查找的内容的 HttpResponseMessage。你可能希望将单元测试设置为异步并等待实际结果,但这应该可以让你开始工作。


1
我看到了 - 我注意到有一个通用的ReadAsAsync方法,所以我将其反序列化为我的响应对象 - response.Result.Content.ReadAsAsync<OrderResponse>().Result; - undefined

2

不要返回Json(response),而是返回Ok(response)。你不需要指定它的格式为JSON。如果客户端请求JSON,则应用程序将返回JSON。(假设您使用默认内容协商。)

然后在单元测试中,您可以像这样从返回的IHttpActionResult中检索数据:

var actionResult = sut.Order(orderId);
var orderResponse = actionResult.ExecuteAsync(new CancellationToken())
    .Result.TryGetContentValue(out OrderResponse expected);

你可以使用expected断言任何你想要的内容,而且你的测试不会对响应的格式做出任何假设。

最初的回答

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接