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
相关产品推荐
相关产品推荐

