Reputation: 5062
I have an ApiController method that looks like this...
[HttpPost]
public IHttpActionResult Post([FromBody] GloballyEnumeratedMessage gem)
{
var result = _gemPublisher.PublishGem(gem);
if (result.Success)
{
return Ok();
}
return new StatusCodeResult((HttpStatusCode)422, this);
}
My test for for checking the Ok result is as follows.
[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));
}
Before I was returning a 422, I was returning a BadRequest and the test looked like this:
[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));
}
I wanted to reserve BadRequest for another potential failure so decided to change the Post method to return a 422 if the Publish fails. What would my test to check for the 422 status code look like?
EDIT: Solved based off a comment to the question
[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);
}
Upvotes: 0
Views: 1814
Reputation: 2041
The following controller and test do what I believe what you want to accomplish:
Controller:
public class MyTestController : ApiController
{
[HttpPost]
public IHttpActionResult Post([FromBody] object gem)
{
return new StatusCodeResult((HttpStatusCode)422, this);
}
}
Test:
[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);
}
Upvotes: 3