xUnit测试中无法实例化MediatR.Mediator代理的问题求助
解决MediatR Mock测试报错问题
报错原因是你直接Mock了MediatR的具体实现类Mediator,这个类没有无参构造函数,Moq无法创建它的代理对象。正确的做法是面向接口Mock,因为你的控制器应该依赖IMediator接口而非具体类。
修改后的测试代码:
[Fact] public void GetAllTest() { // 1. Mock IMediator接口而非具体Mediator类 var mockMediator = new Mock<IMediator>(); // 2. 模拟Send方法的返回值,根据你的GetAll方法实际发送的请求类型调整 var mockResidences = new List<ResidenceDto>(); mockMediator.Setup(m => m.Send(It.IsAny<GetAllResidencesQuery>(), It.IsAny<CancellationToken>())) .ReturnsAsync(mockResidences); // 3. 实例化控制器 var controller = new ResidenceController(mockMediator.Object); // 4. 调用测试方法 var result = controller.GetAll(); // 5. 调整断言逻辑:先获取ActionResult的Ok结果,再断言内部数据类型 var okResult = Assert.IsType<OkObjectResult>(result.Result); Assert.IsType<IEnumerable<ResidenceDto>>(okResult.Value); }
关键修改点说明:
- Mock接口而非具体类:
IMediator是MediatR的核心接口,Moq可以轻松创建它的代理,无需依赖具体类的构造函数。 - 模拟Send方法:控制器的
GetAll内部会调用mediator.Send发送查询请求,必须给Mock设置对应的返回值,否则测试时会返回默认值(null),导致断言失败。 - 修正断言逻辑:API控制器的
GetAll通常返回ActionResult<IEnumerable<ResidenceDto>>,直接断言result.Result为IEnumerable<ResidenceDto>是错误的,需要先提取OkObjectResult,再断言其Value属性的类型。
内容的提问来源于stack exchange,提问作者Ali Majidi
相关产品推荐
相关产品推荐

