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

C#中为传入对象列表的Mock设置方法失败问题求助

解决Moq中对列表内Mock实例的方法配置问题

看起来你搞混了Moq的配置逻辑——你不需要(也没法)直接对_paymentManagers这个列表里的对象设置方法行为,因为列表里的是Moq生成的代理实例,所有方法的配置必须通过你一开始创建的Mock<IPaymentHandler>对象本身来完成。

正确的配置方式分两种场景:

1. 给单个Mock实例设置特定行为

比如你想让正常支付处理器返回成功,失败场景的处理器抛出异常,直接操作你创建的那两个Mock对象就行:

// 配置正常支付处理器:调用HandlePayment时返回true
_mockRecurringPaymentHandler
    .Setup(handler => handler.HandlePayment(It.IsAny<PaymentRequest>()))
    .Returns(true);

// 配置失败场景处理器:调用HandlePayment时抛出异常
_mockRecurringPaymentFailedHandler
    .Setup(handler => handler.HandlePayment(It.IsAny<PaymentRequest>()))
    .Throws(new PaymentFailedException("模拟 recurring 支付失败"));

当你的被测代码遍历_paymentManagers调用每个处理器的方法时,这些配置会自动生效——因为_paymentManagers里的Object就是对应Mock生成的代理,Mock已经把行为绑定到这个实例上了。

2. 批量给所有Mock实例设置统一行为

如果列表里的所有处理器需要有相同的基础行为(比如都能通过支付验证),你可以先把所有Mock实例放到一个列表里,批量配置:

// 先创建一个Mock实例的列表(注意不是Object的列表)
var paymentHandlerMocks = new List<Mock<IPaymentHandler>>
{
    _mockRecurringPaymentHandler,
    _mockRecurringPaymentFailedHandler
    // 其他Mock实例
};

// 批量配置所有Mock的ValidatePayment方法返回true
foreach (var mock in paymentHandlerMocks)
{
    mock.Setup(h => h.ValidatePayment(It.IsAny<PaymentRequest>()))
        .Returns(true);
}

// 最后再把它们的Object放到_paymentManagers里
_paymentManagers = paymentHandlerMocks.Select(m => m.Object);

常见误区提醒

别尝试直接对_paymentManagers里的IPaymentHandler实例调用Setup——Setup是Moq的Mock<T>类特有的方法,不是你定义的IPaymentHandler接口的方法,这么做要么编译报错,要么运行时完全不生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:18:02