XUnit Test Web API断言状态代码

时间:2018-04-19 06:31:54

标签: c# api unit-testing asp.net-core xunit

我是Web API应用程序XUnit测试的新手。我试图用状态代码404断言我的响应值,但我不知道该怎么做。

这是我的测试代码。

  

假设输入为null,测试应返回NotFound或404   状态代码。

  [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?

        }

在此测试方法的最后一行中,我无法进行response.StatusCode编译,因为响应变量中没有StatusCode属性。而且我没有HttpStatusCode课程可以打电话......

这是控制器类中的GetBooksByID()方法。

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

谢谢!

4 个答案:

答案 0 :(得分:1)

您可以检查返回的类型

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

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

Should().BeOfType<T>是来自FluentAssertions库的方法,可在Nuget上找到

答案 1 :(得分:1)

旧问题,但是尽管接受的答案是有效的,但它会引入另一个有用的依赖关系,但并非必须这样做。最直接的方法是参考:

using Microsoft.AspNetCore.Mvc;

然后用以下方法进行测试:

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

假设您的方法返回一个ActionResult。

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

在获得@Brad的提示后,代码会编译并通过测试。

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