2016-12-22 10 views
2

문제점 :메일 리스너는 ocassionally 인증에 실패

우리는 우리가 실제로 테스트 케이스 단계로 테스트 사용자의 이메일을 확인해야하는 여러 검사를해야합니다. 이것은 2 요소 인증 및 전자 메일 알림 테스트에 사용됩니다.

현재을 기반으로 제공된 here 솔루션을 사용합니다. 시간의 약 10 %에서, 메일 -

var MailListener = require("mail-listener2"); 
var mailListener = new MailListener(config.email); 

mailListener.start(); 

mailListener.on("server:connected", function(){ 
    console.log("Mail listener initialized"); 
}); 

global.mailListener = mailListener; 

문제는 다음과 같습니다

email: { 
    username: "user email here", 
    password: "user password here", 
    host: "smtp server address here", 
    port: 993, 
    tls: true, 
    mailbox: "Inbox", 
    markSeen: true 
}, 

우리는 onPrepare() 기능 내부의 각도기 설정에서 메일 수신기를 초기화 : 여기에 우리가 사용하는 구성입니다 청취자는 실패하고 다음 오류 메시지 서버로 인증하는 동안

이 초과

[질문 :

이 어떤 문제를 일으킬 수 있으며, 우리가 메일 리스너 작업을하기 위해 무엇을 할 수 있는가? 또한 실패시 인증을 다시 시도 할 수 있습니까?

답변

2

이것은 비동기 문제입니다. 메일 청취자가 "server : connected"이벤트를 확인하려고합니다. 비동기식이기 때문에 시간이 지남에 따라 달라질 수도 있습니다. 당신이해야 할 일은 약속에 포장하고 "server : connected"이벤트 후에 해결하는 것입니다.

onPrepare: { 
    return new Promise((resolve, reject) => { 
    var MailListener = require("mail-listener2"); 
    var mailListener = new MailListener(config.email); 

    mailListener.start(); 

    mailListener.on("server:connected", function(){ 
     console.log("Mail listener initialized"); 
     resolve(); 
    }); 

    // if you run into an error on connecting to the server, 
    // maybe reject the promise here. 
    mailListener.on("error", (err) => { 
     reject(err); 
    }); 

    global.mailListener = mailListener; 
    }); 
} 
+0

감사를 완벽하게 감각! "재시도"부분을 추가하여 향상시킬 수 있는지 확인해 보겠습니다. – alecxe

+1

우리가 재 시도를 위해 사용하고있는 것을 별도의 답변으로 게시했습니다. 우리가 그것을 단순화하거나 향상시킬 수 있는지보십시오. 다시 한 번 감사드립니다! – alecxe

1

@ cnishina 님의 답변이 많은 도움이되었습니다. onPrepare()이 추가

this.configureMailListener = function (mailListener, maxRetries, deferred) { 
    var self = this; 

    if (!deferred) { 
     deferred = protractor.promise.defer(); 
    } 

    mailListener.start(); 

    mailListener.on("server:connected", function() { 
     console.log("Mail listener initialized."); 
     deferred.fulfill(); 
    }); 

    mailListener.on("error", function (err) { 
     if (maxRetries > 0) { 
      console.log("Mail listener failed to initialize. Retrying..."); 

      setTimeout(function() { 
       mailListener.removeAllListeners(); 
       mailListener.stop(); 

       self.configureMailListener(mailListener, maxRetries - 1, deferred); 
      }, 1000); 
     } else { 
      console.log("Mail listener failed to initialize."); 
      deferred.reject(err); 
     } 
    }); 
    return deferred.promise; 
}; 

사용법 : 우리가 실패 할 경우 메일 리스너 N 시간을 다시 시도하려면 "재시도"부분을 조금 더 그것을 촬영하고 추가 한

onPrepare: function() { 
    // configure email listener 
    var MailListener = require("mail-listener2"); 
    var config = require("../config/config"); 
    var mailListener = new MailListener(config.email); 

    global.mailListener = mailListener; 

    return helpers.configureMailListener(mailListener, 5); // attempt to initialize mail-listener 5 times 
},