Не удалось настроить метод для макета, переданного в список объектов c # - PullRequest
0 голосов
/ 25 апреля 2018

Во время издевательств я столкнулся с некоторыми проблемами.

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

1 Ответ

0 голосов
/ 25 апреля 2018

Помните, что модульное тестирование работает по концепции AAA --- Arrange, Act и Assert. До тех пор, пока вы не расставите вещи соответствующим образом, акт не будет работать должным образом.

Так что здесь, когда вызывается конструктор PaypaIIpnManager, он вызывает ваш RegisterStrategy, который вызывает GetPaymentType для вашего поддельного обработчика. Так как до вызова конструктора GetPaymentType не настроен, поэтому в вашем тесте метод настройки GetPaymentType не вызывается. Итак, здесь вы должны определить GetPaymentType Setup перед вызовом конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...