首页 > 解决方案 > 如何在我的单元测试中从原始 POST 请求中断言 StatusCode?

问题描述

我正在使用ASP.NET Core 2 WebAPIxUnitMoq

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

对于上述两种方法,我们都在使用将IActionResult result对象强制转换为ObjectResultor OkObjectResult

我的项目的主要问题是在转换对象结果之后是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
        }

同样在我的测试课中,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 };

标签: c#moqasp.net-core-webapixunithttp-status-codes

解决方案


在您的代码块中,控制器方法返回StatusCodeResult类型。但是您尝试将其转换为ObjectResult. 这就是你得到空值的原因。

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

1 - )您可以使用return Ok()而不是return StatusCode(...)这样您的控制器方法将返回OkResult,并且通过参数调用Ok(someObj)它将返回OkObjectResult

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

 var okResult = result as StatusCodeResult;

推荐阅读