我正在使用 ASP.NET Core 2 WebAPI、xUnit、Moq。
我有一个问题。我正在尝试来自 this 的解决方案回答和this回答。其他找到的答案似乎与这两个相似。
通过上述两种方法,我们将 IActionResult 结果
对象转换为 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);
}
调试时的
和测试方法:
[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/