C# Web API用xUnit和Mock测试Put方法失败,如何调整测试代码
问题根因
你当前的单元测试仅对UpdateGroup方法做了Mock配置,控制器执行PutGroup时会先调用_groupsService.GetGroupById(id)判断分组是否存在,该方法没有做Mock配置,Moq框架对未配置的引用类型方法默认返回null,所以控制器直接走到NotFound分支,测试断言失败。
解决方案
只需在单元测试中补充GetGroupById方法的Mock配置即可,修改后的测试代码如下:
public void UpdateGroup() { var group = new Group() { GroupName = "Grp", Capacity = 40 }; // 新增配置:指定id为6时GetGroupById返回非空对象,模拟分组已存在 mock.Setup(p => p.GetGroupById(6)).Returns(new Group()); // 原有UpdateGroup配置保留 mock.Setup(p => p.UpdateGroup(6, group)); GroupsController grp = new GroupsController(mock.Object); var result = grp.PutGroup(6, group); Assert.IsType<OkObjectResult>(result); // 可选补充:验证UpdateGroup方法被正常调用一次,提升测试严谨性 mock.Verify(p => p.UpdateGroup(6, group), Times.Once); }
补充说明
如果你的控制器中GroupExists方法内部依赖_groupsService的相关方法做判断,还需要根据该方法的实现逻辑补充对应的Mock配置,避免抛出DbUpdateConcurrencyException时的分支逻辑也返回错误结果。
内容的提问来源于stack exchange,提问作者Hema
相关产品推荐
相关产品推荐

