我有一个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))))
答案 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
声明所需的内容,并且您的测试不会对响应的格式进行任何假设。