superninja
superninja

Reputation: 3401

XUnit Test Web API Assert Status code

I am new in XUnit tests for Web API application. I am trying to make assertion of my response value with the status code 404, but I am not sure how to do so.

Here's my test code.

Assume the input is null, the test is expected to return NotFound or 404 status code.

  [Fact]
        public async Task getBooksById_NullInput_Notfound()
        {

            //Arrange
            var mockConfig = new Mock<IConfiguration>();
            var controller = new BookController(mockConfig.Object);

            //Act
            var response = await controller.GetBooksById(null);

            //Assert
            mockConfig.VerifyAll();

            Assert(response.StatusCode, HttpStatusCode.NotFound()); //How to achieve this?

        }

In the last line of this test method, I am not able to make response.StatusCode compile as in the response variable does not have StatusCode property. And there is no HttpStatusCode class that I can call...

Here's my GetBooksByID() method in the controller class.

 public class BookController : Controller
    {
        private RepositoryFactory _repositoryFactory = new RepositoryFactory();

        private IConfiguration _configuration;

        public BookController(IConfiguration configuration)
        {
            _configuration = configuration;
        }



        [HttpGet]
        [Route("api/v1/Books/{id}")]
        public async Task<IActionResult> GetBooksById(string id)
        {
            try
            {
                if (string.IsNullOrEmpty(id))
                {
                    return BadRequest();
                }

                var response = //bla

                //do something

                if (response == null)
                {
                    return NotFound();
                }
                return new ObjectResult(response);
            }
            catch (Exception e)
            {
                throw;
            }
        }

Thanks!

Upvotes: 6

Views: 20140

Answers (4)

bjnr
bjnr

Reputation: 3437

Assert.Equal(System.Net.HttpStatusCode.Unauthorized, response.StatusCode);

Upvotes: 3

plyawn
plyawn

Reputation: 412

Old question, but while the accepted answer is valid it pulls in another dependency that's helpful but not required to do this. The most straight forward approach is to reference:

using Microsoft.AspNetCore.Mvc;

Then test with:

Assert.IsAssignableFrom<NotFoundObjectResult>(response.Result);

assuming your method returns an ActionResult.

Upvotes: 2

Fabio
Fabio

Reputation: 32455

You can check against returned type

// Act
var actualResult = await controller.GetBooksById(null);

// Assert
actualResult.Should().BeOfType<BadRequestResult>();

Should() and .BeOfType<T> are methods from FluentAssertions library, which available on Nuget

Upvotes: 7

superninja
superninja

Reputation: 3401

After getting hints by @Brad, the code compiles and passed the test.

 response.ToString().Equals(HttpStatusCode.NotFound);

Upvotes: -1

Related Questions