RhinoMock - AssertWasCalled для одного метода с другим параметром не работает - PullRequest
0 голосов
/ 21 января 2019

У меня есть этот метод:

        public void Handle(ShipmentConfirmedEvent message)
    {
        try
        {
            var trackingOrderDto = new ShipmentConfirmedDto
            {
                AccountId = message.AccountId,
                FirstName = message.CustomerFirstName,
                TransactionId = message.TransactionId,
                Language = message.LanguageCode,
                ExcludedCommunicationChannels = message.ExcludedCommunicationChannels,
                TrackingId = message.TrackingNumber
            };

            Log.Info("Received notify of Shipment Confirmed request with id <{0}> for order {1}", message.GenerationId, message.TransactionId);
            if (!string.IsNullOrEmpty(_iosForcePushAccountId))
            {
                Log.Info("Per device Ios, l'accountId {0} verrà forzato a {1} per configurazione", trackingOrderDto.AccountId, _iosForcePushAccountId);
                trackingOrderDto.AccountId = Convert.ToInt64(_iosForcePushAccountId);
            }
            Log.Debug("Send push notification for IOS for AccountId <{0}>", trackingOrderDto.AccountId);
            var iosContent = _sender.Create(trackingOrderDto, "IOS");
            _sender.IosSend(iosContent);

            trackingOrderDto.AccountId = message.AccountId;

            if (!string.IsNullOrEmpty(_androidForcePushAccountId))
            {
                Log.Info("Per device Android, l'accountId {0} verrà forzato a {1} per configurazione", trackingOrderDto.AccountId, _androidForcePushAccountId);
                trackingOrderDto.AccountId = Convert.ToInt64(_androidForcePushAccountId);
            }
            Log.Debug("Send push notification for Android for AccountId <{0}>", trackingOrderDto.AccountId);
            var androidContent = _sender.Create(trackingOrderDto, "ANDROID");
            _sender.AndroidSend(androidContent);
        }
        catch (ExcludedCommunicationChannelsException ex)
        {
            Log.Warn(ex.Message);
        }
        catch (Exception ex)
        {
            var msg = String.Format("Errore durante la gestione del messaggio relativo al PushNotification for username {0}", message.MailTo.First().Address);
            Log.Error(ex, msg);
            throw new Exception(ex.Message, ex);
        }
        Log.Info("<{0}> Processed", message.GenerationId);
    }

и у меня есть этот тест:

[Fact]
    public void GivenAnOrderConfirmedEventWithForcedAccountId_WhenHandle_ThenCallSenderWithTheForcedAccountId()
    {
        NServiceBus.Testing.Test.Initialize();

        var service = new ShipmentConfirmedRequestEventConsumer(mockSender, "1111", "2222");

        NServiceBus.Testing.Test.Handler(svc => service)
            .OnMessage<ShipmentConfirmedEvent>(
                m =>
                {
                    m.AccountId = 407716;
                    m.CustomerFirstName = "Marco";
                    m.TransactionId = "T123456";
                    m.LanguageCode = "IT";
                    m.TrackingNumber = "642167921";
                }
            );
        mockSender.AssertWasCalled(x => x.Create(Arg<ShipmentConfirmedDto>.Matches(dto => dto.AccountId == 2222), Arg<string>.Is.Equal("ANDROID")));
        mockSender.AssertWasCalled(x => x.Create(Arg<ShipmentConfirmedDto>.Matches(dto => dto.AccountId == 1111), Arg<string>.Is.Equal("IOS")));
    }

второй AssertWasCalled, связанный с IOS, выдает исключение, потому что кажется, что он перезаписан, будучи в методе первым, который будет вызван.

Мне нужно убедиться, что метод Create вызывается дважды внутри метода с указанными параметрами.

Как я могу изменить тест для его проверки?

1 Ответ

0 голосов
/ 22 января 2019

Решение состоит в том, чтобы изменить тестирование следующим образом:

[Fact]
    public void GivenAnOrderConfirmedEventWithForcedAccountId_WhenHandle_ThenCallSenderWithTheForcedAccountId()
    {
        NServiceBus.Testing.Test.Initialize();
        mockSender.Expect(x => x.Create(Arg<ShipmentConfirmedDto>.Matches(dto => dto.AccountId == 2222), Arg<string>.Is.Equal("ANDROID"))).Return(string.Empty);
        mockSender.Expect(x => x.Create(Arg<ShipmentConfirmedDto>.Matches(dto => dto.AccountId == 1111), Arg<string>.Is.Equal("IOS"))).Return(string.Empty);
        var service = new ShipmentConfirmedRequestEventConsumer(mockSender, "1111", "2222");

        NServiceBus.Testing.Test.Handler(svc => service)
            .OnMessage<ShipmentConfirmedEvent>(
                m =>
                {
                    m.AccountId = 407716;
                    m.CustomerFirstName = "Marco";
                    m.TransactionId = "T123456";
                    m.LanguageCode = "IT";
                    m.TrackingNumber = "642167921";
                }
            );

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