单元测试状态代码不在 HttpStatusCode 枚举中的 ApiController 方法
Unit testing ApiController methods with status codes not in HttpStatusCode enum
我有一个看起来像这样的 ApiController 方法...
[HttpPost]
public IHttpActionResult Post([FromBody] GloballyEnumeratedMessage gem)
{
var result = _gemPublisher.PublishGem(gem);
if (result.Success)
{
return Ok();
}
return new StatusCodeResult((HttpStatusCode)422, this);
}
我检查Ok结果的测试如下。
[TestMethod]
public void Post_ValidGem_Returns200()
{
_gemPublisherMock.Setup(v => v.PublishGem(It.IsAny<GloballyEnumeratedMessage>())).Returns(ResultStatus.FromSuccess());
var controller = new PublishGemController(_gemPublisherMock.Object);
// Act
IHttpActionResult actionResult = controller.Post(It.IsAny<GloballyEnumeratedMessage>());
// Assert
Assert.IsInstanceOfType(actionResult, typeof(OkResult));
}
在我 returning 422 之前,我 returning BadRequest 测试看起来像这样:
[TestMethod]
public void Post_InvalidGem_Returns400()
{
_gemPublisherMock.Setup(v => v.PublishGem(It.IsAny<GloballyEnumeratedMessage>())).Returns(ResultStatus.FromFailure());
var controller = new PublishGemController(_gemPublisherMock.Object);
// Act
IHttpActionResult actionResult = controller.Post(It.IsAny<GloballyEnumeratedMessage>());
// Assert
Assert.IsInstanceOfType(actionResult, typeof(BadRequestResult));
}
我想为另一个潜在的失败保留 BadRequest,因此决定在发布失败时将 Post 方法更改为 return 422。我检查 422 状态代码的测试是什么样的?
编辑:根据对问题的评论解决
[TestMethod]
public void Post_InvalidGem_Returns422()
{
_gemPublisherMock.Setup(v => v.PublishGem(It.IsAny<GloballyEnumeratedMessage>())).Returns(ResultStatus.FromFailure());
var controller = new PublishGemController(_gemPublisherMock.Object);
// Act
IHttpActionResult actionResult = controller.Post(It.IsAny<GloballyEnumeratedMessage>());
var result = (StatusCodeResult) actionResult;
// Assert
Assert.IsInstanceOfType(actionResult, typeof(StatusCodeResult));
Assert.AreEqual(422, (int)result.StatusCode);
}
下面的控制器和测试做我相信你想要完成的事情:
控制器:
public class MyTestController : ApiController
{
[HttpPost]
public IHttpActionResult Post([FromBody] object gem)
{
return new StatusCodeResult((HttpStatusCode)422, this);
}
}
测试:
[TestMethod]
public void Post_Returns422()
{
var controller = new MyTestController();
// Act
IHttpActionResult actionResult = controller.Post(It.IsAny<object>());
// Assert
Assert.IsInstanceOfType(actionResult, typeof(StatusCodeResult));
Assert.AreEqual((int)((StatusCodeResult)actionResult).StatusCode,422);
}
我有一个看起来像这样的 ApiController 方法...
[HttpPost]
public IHttpActionResult Post([FromBody] GloballyEnumeratedMessage gem)
{
var result = _gemPublisher.PublishGem(gem);
if (result.Success)
{
return Ok();
}
return new StatusCodeResult((HttpStatusCode)422, this);
}
我检查Ok结果的测试如下。
[TestMethod]
public void Post_ValidGem_Returns200()
{
_gemPublisherMock.Setup(v => v.PublishGem(It.IsAny<GloballyEnumeratedMessage>())).Returns(ResultStatus.FromSuccess());
var controller = new PublishGemController(_gemPublisherMock.Object);
// Act
IHttpActionResult actionResult = controller.Post(It.IsAny<GloballyEnumeratedMessage>());
// Assert
Assert.IsInstanceOfType(actionResult, typeof(OkResult));
}
在我 returning 422 之前,我 returning BadRequest 测试看起来像这样:
[TestMethod]
public void Post_InvalidGem_Returns400()
{
_gemPublisherMock.Setup(v => v.PublishGem(It.IsAny<GloballyEnumeratedMessage>())).Returns(ResultStatus.FromFailure());
var controller = new PublishGemController(_gemPublisherMock.Object);
// Act
IHttpActionResult actionResult = controller.Post(It.IsAny<GloballyEnumeratedMessage>());
// Assert
Assert.IsInstanceOfType(actionResult, typeof(BadRequestResult));
}
我想为另一个潜在的失败保留 BadRequest,因此决定在发布失败时将 Post 方法更改为 return 422。我检查 422 状态代码的测试是什么样的?
编辑:根据对问题的评论解决
[TestMethod]
public void Post_InvalidGem_Returns422()
{
_gemPublisherMock.Setup(v => v.PublishGem(It.IsAny<GloballyEnumeratedMessage>())).Returns(ResultStatus.FromFailure());
var controller = new PublishGemController(_gemPublisherMock.Object);
// Act
IHttpActionResult actionResult = controller.Post(It.IsAny<GloballyEnumeratedMessage>());
var result = (StatusCodeResult) actionResult;
// Assert
Assert.IsInstanceOfType(actionResult, typeof(StatusCodeResult));
Assert.AreEqual(422, (int)result.StatusCode);
}
下面的控制器和测试做我相信你想要完成的事情:
控制器:
public class MyTestController : ApiController
{
[HttpPost]
public IHttpActionResult Post([FromBody] object gem)
{
return new StatusCodeResult((HttpStatusCode)422, this);
}
}
测试:
[TestMethod]
public void Post_Returns422()
{
var controller = new MyTestController();
// Act
IHttpActionResult actionResult = controller.Post(It.IsAny<object>());
// Assert
Assert.IsInstanceOfType(actionResult, typeof(StatusCodeResult));
Assert.AreEqual((int)((StatusCodeResult)actionResult).StatusCode,422);
}