【问题标题】:Couldn't Setup method for mock passed into list of objects c#无法将模拟的设置方法传递到对象列表中 c#
【发布时间】:2018-04-25 09:00:53
【问题描述】:

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

 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;
        }

【问题讨论】:

  • 理想情况下,它应该可以工作,直到您不更改 _mockRecurringPaymentHandlerPaypaIIpnManager 的引用本身调用尚未定义的 GetPaymentType,因此您应该在传递列表之前定义它
  • 好的,但是如果我们传递的不是列表而是单个对象,为什么相同的方法可以工作,然后在其中一种方法中进行设置?
  • 对于列表它有不同的行为?
  • 是否所有显示的代码都存在于一种方法中?
  • 不,_paymentManagers = 新列表 { _mockRecurringPaymentHandler.Object, _mockRecurringPaymentFailedHandler.Object }; _sut = new PaypaIIpnManager(_paymentManagers, _mockLogger.Object);它存在于 Setup 方法中

标签: c# asp.net .net unit-testing moq


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 1970-01-01
    • 2013-05-14
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2018-08-19
    相关资源
    最近更新 更多