首页 > 解决方案 > 无法设置将模拟传递到对象列表中的方法c#

问题描述

在嘲笑我遇到了一些问题。

 private Mock<IPaymentHandler> _mockRecurringPaymentHandler;
 private Mock<IPaymentHandler> _mockRecurringPaymentFailedHandler;
 private IEnumerable<IPaymentHandler> _paymentManagers;

_mockRecurringPaymentHandler = new Mock<IPaymentHandler>();
_mockRecurringPaymentFailedHandler = new Mock<IPaymentHandler>();

_paymentManagers = new List<IPaymentHandler>
{
    _mockRecurringPaymentHandler.Object,
    _mockRecurringPaymentFailedHandler.Object
};

_sut = new PaypaIIpnManager(
    _paymentManagers,
    _mockLogger.Object
    );

最近,当我尝试为 设置方法时mockRecurringPaymentHandler,例如:

_mockRecurringPaymentHandler.Setup(method => method.GetPaymentType()).Returns("GFDGDFGDFG");

它不起作用。仅当我在将其传递给列表之前执行此操作时才有效。为什么会有这样的行为?

public PaypaIIpnManager(
            IEnumerable<IPaymentHandler> paymentHandlers,
            ILoggerService<PaypaIIpnManager> logger)
        {
            _handlersDic = RegisterStrategy(paymentHandlers);
            _logger = logger;
        }

protected Dictionary<string, IPaymentHandler> RegisterStrategy(IEnumerable<IPaymentHandler> paymentHandlers)
        {
            var dic = new Dictionary<string, IPaymentHandler>();

            foreach (var handler in paymentHandlers)
            {
                var paymentType = handler.GetPaymentType();

                dic.Add(paymentType, handler);
            }

            return dic;
        }

标签: c#asp.net.netunit-testingmoq

解决方案


请记住,单元测试基于 AAA 的概念 --- Arrange、Act 和 Assert。除非您没有适当地安排事情,否则行为不会按要求进行。

所以在这里,当PaypaIIpnManager构造函数被调用时,它会调用你的RegisterStrategywhich 调用GetPaymentType你的模拟处理程序。由于在调用构造函数之前,GetPaymentType未设置,这就是为什么在您的测试GetPaymentType中未调用设置方法的原因。所以在这里,你应该GetPaymentType在调用构造函数之前定义设置。


推荐阅读