如何测试MVC Controller Action的响应StatusCode

时间:2017-10-04 10:38:24

标签: c# asp.net-core asp.net-core-mvc mstest

我想为我的控制器编写单元测试。

我想查看操作的响应代码。例如,Post操作应该返回201,get应该返回200等等。

但是,Action方法返回IActionResult。如何从ActionResult获取响应代码?

 //setup
 MyController controller = CreateController<MyController>();

 //action
 var actionResult = controller.Post(dafXml);

 //assert
 ???

我不想检查动作结果的类型,因为我只关心状态代码。例如,201可以通过CreatedAtActionCreatedAtRoute或自定义ObjectResult来实现...

2 个答案:

答案 0 :(得分:2)

您只需在ExecuteAsync对象上调用IHttpActionResult方法即可获取HttpResponseMessage类型的Http响应,然后访问StatusCode属性进行验证。

您还可以参考IHttpActionResult的工作原理 -

https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/action-results

答案 1 :(得分:1)

FluentAssertions提供了断言控制器响应代码的优雅方式。见下面的例子。

// 200
actionResult.Should().BeOfType<OkObjectResult>()
    .Which.StatusCode.Should().Be((int)HttpStatusCode.OK);

// 201
actionResult.Should().BeOfType<CreatedResult>()
    .Which.StatusCode.Should().Be((int)HttpStatusCode.Created);

// 500
actionResult.Should().BeOfType<ObjectResult>()
    .Which.StatusCode.Should().Be((int)HttpStatusCode.InternalServerError);