模拟单元测试

时间:2020-06-16 08:28:42

标签: c# unit-testing mocking

我必须对一个函数(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());
        }

但是,当我执行测试时,出现一个错误,告诉我我要模拟的服务为空(EnvoyerNotificationSms.SendMessageNetSky(signalRMessage);) 错误是:“对象引用未设置为对象的实例。”在EnvoyerNotificationSms.SendMessageNetSky(signalRMessage);

行中

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

在检查问题之后,是这些行的顺序:

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

第二行无效,因为我要模拟的服务已在第一行中创建。因此解决方案是更改两行的顺序。