繁体   English   中英

模拟单元测试

[英]unit testing with mock

我必须对 function ( SendMessageNetSkyToAgenceGrp ) 进行单元测试,并且在这个 function 内部有一个我想模拟的服务( 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); ) 错误是:'对象引用未设置为 object 的实例。 EnvoyerNotificationSms.SendMessageNetSky(signalRMessage);

我该如何解决这个问题?

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

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

在第二行没有任何效果,因为我要模拟的服务已经在第一行创建。 所以解决方案是改变两行的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM