【问题标题】:XUnit Test Web API Assert Status codeXUnit 测试 Web API 断言状态代码
【发布时间】:2018-04-19 06:31:53
【问题描述】:

我是 XUnit Web API 应用程序测试的新手。我正在尝试使用状态码 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;
            }
        }

谢谢!

【问题讨论】:

  • 它不会编译,因为HttpStatusCode.NotFound() 不是一个方法。删除括号,例如HttpStatusCode.NotFound.
  • @Brad 谢谢!它现在可以工作了:)

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


【解决方案1】:

您可以检查返回的类型

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

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

Should().BeOfType&lt;T&gt; 是来自 FluentAssertions 库的方法,可在 Nuget 上使用

【讨论】:

  • 我的错,我没用using FluentAssertions;
  • sry,但 NotFound 未编译,我是否缺少任何其他包?
  • @Brad,这是测试预期响应的另一种方法,这是 OP 实际尝试做的。似乎接近适合 OP。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    老问题,但虽然接受的答案是有效的,但它会引入另一个有用但不需要这样做的依赖项。最直接的方法是参考:

    using Microsoft.AspNetCore.Mvc;
    

    然后测试:

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

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

    【讨论】:

      【解决方案4】:

      得到@Brad的提示后,代码编译通过,测试通过。

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

      【讨论】:

        猜你喜欢
        • 2015-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-20
        • 2017-01-13
        相关资源
        最近更新 更多