如何测试MVC控制器操作的响应状态码

5

我希望能为我的控制器编写单元测试。

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

然而,Action方法返回IActionResult。我该如何从ActionResult中获取响应代码?

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

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

 //assert
 ???

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

4个回答

11

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);

很好,但是它仍然是第三方库,并且一旦引入解决方案,它会对单元测试带来相当彻底的变化。 - Liero

1
你可以简单地调用 IHttpActionResult 对象上的 ExecuteAsync 方法来获取类型为 HttpResponseMessage 的 Http 响应,然后访问 StatusCode 属性来进行验证。
你也可以参考这些文档来了解 IHttpActionResult 的工作原理。

2
你的回答对于Web API 2是正确的。然而,OP是针对Asp.net-Core的,这仍然适用。但是你应该找到来自核心的文档以确保。 - Nkosi

1
ActionResult result = /* Your action result */;
int statusCode = (result as StatusCodeResult)?.StatusCode

3
请记住,Stack Overflow 不仅旨在解决当前的问题,还要帮助未来的读者找到类似问题的解决方案,这需要理解底层代码。对于我们社区中的初学者和不熟悉语法的成员来说,这尤其重要。鉴于此,您能否编辑您的答案,包括您正在做什么的解释以及为什么您认为这是最好的方法? - Jeremy Caney

0
我喜欢那个有流利断言的答案,但并不是每个人都能使用它们。如果你需要常规的Assert语句,下面是它的写法...
//setup
MyController controller = CreateController<MyController>();

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

//assert
Assert.IsNotNull(actionResult);
var okResult = response.Result as OkObjectResult;
Assert.AreEqual((int)HttpStatusCode.OK, okResult.StatusCode);
Assert.AreEqual("If a string is returned, it goes here", okResult.Value);

我想象一下,这就是201和500的样子(这些还没有经过测试)。
// 201
var createdResult = response.Result as CreatedResult;
Assert.AreEqual((int)HttpStatusCode.Created, createdResult.StatusCode);

// 500
var objectResult = response.Result as ObjectResult;
Assert.AreEqual((int)HttpStatusCode.InternalServerError, objectResult.StatusCode);

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