如何在我的单元测试中从原始 POST 请求断言 StatusCode?

How to Assert StatusCode from raw POST request in my unit tests?

我正在使用 ASP.NET Core 2 WebAPIxUnitMoq .

我有问题。我正在尝试 answer and 答案中的解决方案。其他找到的答案似乎与这两个相似。

通过上述两种方法,我们将 IActionResult result 对象转换为 ObjectResultOkObjectResult

我的项目的主要问题是在转换对象后结果是 null

测试方法:

[Fact]
        public async Task Post_CalledWithDefaultSetup_CallsAllMethods()
        {
            //default setup arranged in the ctor

            IActionResult result = await _controller.Post();
            var okResult = result as ObjectResult;

            Assert.Equal(StatusCodes.Status200OK, okResult.StatusCode);
        }

result 调试对象:

和测试方法:

[HttpPost]
        public async Task<IActionResult> Post()
        {
            //do some logic here
            return StatusCode((int)HttpStatusCode.OK); //debug hits this
        }

也在我的测试中 class ctor 我正在安排我的模拟和 ControllerContext:

_serializationServiceMock.Setup(s => s.UnzipData(_array))
                .Returns(_jsonExample);
            _serializationServiceMock.Setup(s => s.DeserializeDataFromJson(_jsonExample))
                .Returns(_listPersonModel);

            var stream = new MemoryStream(_array);
            var httpContext = new DefaultHttpContext();
            httpContext.Request.Body = stream;
            httpContext.Request.ContentLength = stream.Length;
            var controllerContext = new ControllerContext()
            {
                HttpContext = httpContext,
            };
            _controller = new DataController(_repositoryMock.Object, _serializationServiceMock.Object) { ControllerContext = controllerContext };

在您的代码块中,控制器方法 returns StatusCodeResult 类型。但是您尝试将其转换为 ObjectResult。这就是为什么你得到 null.

您可以通过两种方式解决这个问题;

1 -) 你可以使用 return Ok() 而不是 return StatusCode(...) 所以你的控制器方法将 return OkResult 和参数调用 Ok(someObj) 它将 return OkObjectResult

2 -) 您可以将 Post 结果转换为 StatusCodeResult 而不是 ObjectResult 因为您的端点 return 状态代码结果如下。

 var okResult = result as StatusCodeResult;