如何测试返回IActionResult的ASP.NET Core API方法及获取其内容
解决测试方法适配IActionResult返回类型的问题
你完全不需要重构新增方法,直接从返回的IActionResult里提取出目标集合就能解决测试报错的问题。原因很简单:你在正常流程里返回的Ok(...)本质上是OkObjectResult类型(它实现了IActionResult接口),这个类型的Value属性就存储着你传入的IEnumerable<GS1AIPresentation>集合。
修改后的测试代码
把报错的那一行替换成下面的代码,就能正确获取到目标集合:
// Act var result = controller.Get() as OkObjectResult; var presentations = result.Value as IEnumerable<Models.GS1AIPresentation>;
更严谨的测试写法(可选)
为了让测试更健壮,你可以先验证返回结果的类型,避免空引用风险:
// Act IActionResult actionResult = controller.Get(); var okResult = actionResult as OkObjectResult; // 先验证返回的是预期的Ok结果 Assert.IsNotNull(okResult); Assert.AreEqual(200, okResult.StatusCode); // 再提取并转换数据 var presentations = okResult.Value as IEnumerable<Models.GS1AIPresentation>; Assert.IsNotNull(presentations); // 后续的Assert逻辑保持不变 Assert.AreEqual(presentations.Select(g => g.Id).Intersect(gs1Data.Select(d => d.Id)).Count(), presentations.Count());
额外提示:异常分支的测试
如果你还想测试异常场景(即返回500状态码的情况),可以在测试里模拟抛出异常的情况,然后验证返回的是StatusCodeResult且状态码为500:
[Test] public void ShouldReturn500WhenExceptionThrown() { // Arrange:模拟_context或_mapper抛出异常 // ... 这里写模拟异常的逻辑 GS1AIController controller = new GS1AIController(mockContext.Object, mockMapper.Object); // Act var actionResult = controller.Get(); var statusCodeResult = actionResult as StatusCodeResult; // Assert Assert.IsNotNull(statusCodeResult); Assert.AreEqual(500, statusCodeResult.StatusCode); }
内容的提问来源于stack exchange,提问作者VansFannel
相关产品推荐
相关产品推荐

