簡體   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