RhinoMock-在具有不同参数的相同方法上调用AssertWas无效

时间:2019-01-21 16:23:36

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

我有这种方法:

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

第二个与IOS相关的AssertWasCalled抛出异常,因为它似乎已被覆盖,并且位于第一个要调用的方法之内。

我需要验证使用指定的参数在方法中两次调用Create方法。

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

1 个答案:

答案 0 :(得分:0)

解决方案是通过以下方式修改测试:

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