单元测试IHttpActionResult,不强制返回类型

时间:2019-05-21 15:50:10

标签: c# asp.net asp.net-mvc unit-testing

我有一个Web API控制器,其方法类似于(截断的无关位):

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) } ,因此我目前正在将单元测试中的结果转换为ifelse。但是,这要求我的测试知道返回值是如何在控制器中实现的,并且如果可能的话,我希望实现更宽松的耦合,以便在响应实现发生更改时测试不会中断。

sample <- transform(sample,
                    Type=factor(ifelse(ID %in% 1659:1685, "V13", 
                                       ifelse(ID %in% 30759:30788, "V16",
                                              NA))))

2 个答案:

答案 0 :(得分:1)

简而言之?只使用界面上可用的方法!

  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 :(得分:1)

返回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声明所需的内容,并且您的测试不会对响应的格式进行任何假设。