модульное тестирование с макетом - PullRequest
0 голосов
/ 16 июня 2020

Мне нужно провести модульное тестирование функции (SendMessageNetSkyToAgenceGrp), и внутри этой функции есть служба, которую я хочу имитировать (EnvoyerNotificationSms.SendMessageNetSky(signalRMessage)): Вот код, который я хочу протестировать:

public void SendMessageNetSkyToAgenceGrp(
            int agenceId,
            string message,
            string name,
            bool addAgenceLibInMsg = true,
            SignalRMessageThemeEnum theme = SignalRMessageThemeEnum.Information)
        {
            Agence agence = AgenceCoreService.GetAgenceById(agenceId);

            if (agence == null || (string.IsNullOrEmpty(agence.Libelle) && addAgenceLibInMsg))
            {
                return;
            }

            string finalMessage = (message + (addAgenceLibInMsg ? agence.Libelle : ""));

            string groupName = string.Empty;

            if (theme == SignalRMessageThemeEnum.NotificationSms)
            {
                groupName = SignalRConstantes.GRP_SMSAGENCE + SignalRConstantes.SEPARATOR + agenceId;
            } 
            else
            {
                groupName = (SignalRConstantes.GRP_AGENCE + SignalRConstantes.SEPARATOR + agenceId);
            }

            SignalRMessage signalRMessage = new SignalRMessage(name, "", finalMessage, groupName, theme);

            EnvoyerNotificationSms.SendMessageNetSky(signalRMessage);
        } 

И вот тестовый код:

[Fact(DisplayName = "Vérifier l'appel à l'infra IEnvoyerNotificationSms")]
        public void SendMessageNetSkyToAgenceGrp_CasNormal_ResultatOk()
        {
            // Arange            
            var envoyerNotificationSmMock = new Mock<IEnvoyerNotificationSms>();
            envoyerNotificationSmMock.Setup(envoyerNotifSms => envoyerNotifSms.SendMessageNetSky(It.IsAny<SignalRMessage>())).Verifiable();

            var SignalRCoreService = LocalIocManager.Resolve<ISignalRCoreService>();
            // Act 
            LocalIocManager.IocContainer.UseInstance(envoyerNotificationSmMock.Object, IfAlreadyRegistered.Replace);            
            SignalRCoreService.SendMessageNetSkyToAgenceGrp(56, "testMessage", "name", true, SignalRMessageThemeEnum.NotificationSms);

            // Assert
            envoyerNotificationSmMock.Verify(envoyerNotifSms => envoyerNotifSms.SendMessageNetSky(It.IsAny<SignalRMessage>()), Times.Once());
        }

Но когда я выполняю тест, я получаю сообщение об ошибке, сообщающее мне, что служба, которую я хочу имитировать, имеет значение null (EnvoyerNotificationSms.SendMessageNetSky(signalRMessage);). Ошибка: ' В экземпляре объекта не задана ссылка на объект.' в строке EnvoyerNotificationSms.SendMessageNetSky(signalRMessage);

Как решить эту проблему?

1 Ответ

0 голосов
/ 16 июня 2020

После проверки проблема заключалась в следующем порядке этих строк:

var SignalRCoreService = LocalIocManager.Resolve<ISignalRCoreService>();
            // Act 
LocalIocManager.IocContainer.UseInstance(envoyerNotificationSmMock.Object, IfAlreadyRegistered.Replace);            

Во второй строке не имеет никакого эффекта, потому что служба, которую я хочу имитировать, уже создана в первой строке. Итак, решение заключалось в изменении порядка двух строк.

...