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

如何在NUnit测试中Mock控制器中的GetStatus方法

解决Mock控制器中GetStatus方法的问题

核心问题分析

你的测试代码存在几个关键错误:

  1. 返回值写法错误:Returns(Task<int>)直接引用类型而非实例,导致编译报错。
  2. 方法名不匹配:测试中Setup的是GetEodStatus,但控制器实际调用的是GetStatus。
  3. 参数类型可能不一致:控制器中GetStatus接收DateTime类型参数,但你提供的Mock目标方法参数是string,需确保接口定义和调用逻辑匹配。

修正后的测试代码

public async Task ShouldReturnOKStatus()
{
    // 准备测试用日期
    var executionDate = new DateTime(2024, 1, 1);
    
    // 创建IEodCheckManager的Mock实例
    var eodCheckManagerMock = new Mock<IEodCheckManager>();
    
    // 正确Mock GetStatus方法:匹配参数类型,返回异步结果
    eodCheckManagerMock.Setup(x => x.GetStatus(executionDate))
                       .ReturnsAsync(1); // 自动包装为Task<int>,等价于Returns(Task.FromResult(1))
    
    // 初始化控制器并注入Mock实例
    var controller = new YourController(eodCheckManagerMock.Object);
    
    // 执行测试方法
    var response = await controller.GetCheckAsync(executionDate);
    
    // 断言结果
    Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
}

关键修正点说明

  • 使用ReturnsAsync:这是Moq处理异步方法Mock最简洁的方式,直接传入要返回的int值,Moq会自动封装为Task<int>实例。
  • 方法名与参数严格匹配:确保Setup的方法名(GetStatus)和参数类型(DateTime)与控制器调用的逻辑完全一致,如果接口定义参数为string,则需同步调整控制器参数或Mock的参数匹配规则。
  • 注入Mock实例:必须将Mock的Object属性传入控制器构造函数,否则控制器会调用真实实现而非Mock对象。

额外技巧:匹配任意参数

如果不需要限制特定日期,可使用It.IsAny<T>匹配任意参数:

eodCheckManagerMock.Setup(x => x.GetStatus(It.IsAny<DateTime>()))
                   .ReturnsAsync(1);

内容的提问来源于stack exchange,提问作者Shankar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:57:44