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

标签 c# moq asp.net-core-webapi xunit http-status-codes

我正在使用 ASP.NET Core 2 WebAPIxUnitMoq

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

通过上述两种方法,我们将 IActionResult 结果 对象转换为 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 对象: 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 };

最佳答案

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

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

1 -) 您可以使用 return Ok() 而不是 return StatusCode(...) 这样您的 Controller 方法将返回 OkResult 和带参数的调用 Ok(someObj) 它将返回 OkObjectResult

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

 var okResult = result as StatusCodeResult;

关于c# - 如何在我的单元测试中从原始 POST 请求断言 StatusCode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57396643/

相关文章:

c# - 获取错误 : unsupported_grant_type using httpclient to post formdata in asp. 网络控制台应用程序

c# - WebApi 2 中的单元测试 IAuthenticationFilter

json - 在获取 json 数据和 http 文件时出现异常

postgresql - 从 Docker Compose 堆栈中的 ASP.NET Core 6 通过 Npgsql 连接到 PostgreSql

c# - 为什么 Authentication Cookie 对 [Authorize] 属性不起作用?

c# - 在类似的 WPF 应用程序之间共享 View

c# - 数据流的 block 设计受阻

c# - AppDomain AssemblyResolve 事件请求 Microsoft.Practices.EnterpriseLibrary.Common.resources

c# - 如何为最小起订量中的属性赋值?

C# MVC Mock Model 通过接口(interface)打破了 Controller