c# - 如何在我的单元测试中从原始 POST 请求中断言 StatusCode?
问题描述
我正在使用ASP.NET Core 2 WebAPI、xUnit、Moq。
我有个问题。我正在尝试这个答案和这个答案的解决方案。其他找到的答案似乎与这两个相似。
对于上述两种方法,我们都在使用将IActionResult result
对象强制转换为ObjectResult
or 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 };
解决方案
在您的代码块中,控制器方法返回StatusCodeResult
类型。但是您尝试将其转换为ObjectResult
. 这就是你得到空值的原因。
您可以通过两种方式解决此问题;
1 - )您可以使用return Ok()
而不是return StatusCode(...)
这样您的控制器方法将返回OkResult
,并且通过参数调用Ok(someObj)
它将返回OkObjectResult
。
2 - )您可以将 Post 结果转换为,StatusCodeResult
而不是ObjectResult
因为您的端点返回状态代码结果,如下所示。
var okResult = result as StatusCodeResult;
推荐阅读
- typescript - 有没有更好的方法来循环遍历数组以检查重复项?
- asp.net - 在带有 Razor 应用程序的 ASP.NET Core 中路由默认标识页面的问题
- android - Resources$NotFoundException: 带有 Toast.makeText 的字符串资源 ID #0x0
- javascript - 从 Firestore 返回查询的问题
- amazon-web-services - 通过 AWS CLI 将大型 DynamoDB 表索引到 Cloudsearch
- jquery - 从网页获取链接
- angular - 生产构建 (--prod) 删除装饰器/类
- python - 使用 python 将文件上传到 IBM 云对象存储时出错
- c - 如何确定一个点是否在边界内?
- docker - DTLSv1_listen 无法接受 docker 容器中的第二个客户端