如何在我的单元测试中从原始 POST 请求断言 StatusCode?
How to Assert StatusCode from raw POST request in my unit tests?
我正在使用 ASP.NET Core 2 WebAPI、xUnit、Moq .
我有问题。我正在尝试 answer and 答案中的解决方案。其他找到的答案似乎与这两个相似。
通过上述两种方法,我们将 IActionResult result
对象转换为 ObjectResult
或 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
}
也在我的测试中 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;
我正在使用 ASP.NET Core 2 WebAPI、xUnit、Moq .
我有问题。我正在尝试
通过上述两种方法,我们将 IActionResult result
对象转换为 ObjectResult
或 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
}
也在我的测试中 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;