【问题标题】:RhinoMock - AssertWasCalled on same method with different parameter doesn't workRhinoMock - AssertWasCalled 在具有不同参数的相同方法上不起作用
【发布时间】:2019-06-15 01:57:54
【问题描述】:

我有这个方法:

        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 方法在方法中被调用了两次,并指定了参数。

如何修改测试以进行验证?

【问题讨论】:

    标签: c# unit-testing testing tdd rhino-mocks


    【解决方案1】:

    解决办法是这样修改测试:

    [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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-15
      • 2013-06-13
      • 2016-09-21
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多