XUnit Test Web API Assert Status code
Asked Answered
F

4

6

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!

Flotsam answered 19/4, 2018 at 6:31 Comment(2)
It won't compile because HttpStatusCode.NotFound() is not a method. Remove the parenthesis e.g. HttpStatusCode.NotFound.Munos
@Munos thx! It works now :)Flotsam
J
7

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

John answered 19/4, 2018 at 7:1 Comment(3)
My bad, I didnt use using FluentAssertions;Flotsam
sry, but NotFound is not compile, am I missing any other package?Flotsam
@Brad, this was an alternative approach to test for expected response, what OP actually tried to do. Seems approach suit OP.John
F
3

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

Ferrate answered 18/6, 2020 at 16:30 Comment(0)
T
2

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.

Talya answered 29/9, 2019 at 20:29 Comment(0)
F
-1

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

 response.ToString().Equals(HttpStatusCode.NotFound);
Flotsam answered 19/4, 2018 at 7:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.