You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:03:12