2016-12-22 24 views
2

問題:郵件監聽ocassionally身份驗證失敗

我們有我們需要實際檢查測試用戶的電子郵件作爲測試用例一步多個測試。這用於雙因素身份驗證和電子郵件通知測試。

目前,我們使用的解決方案here基於mail-listener2 node package。下面是我們使用的配置:

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

我們初始化郵件監聽器在量角器配置的onPrepare()函數內部:

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; 

的問題是 - 在時代的約10%,郵件聽者失敗,出現以下錯誤消息:

超時而與服務器認證

問題:

什麼會導致問題,我們能做些什麼使聽者郵件工作?另外,是否有可能重試對失敗進行身份驗證?

回答

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的回答非常有幫助。我們已經採取了它遠一點,並加入了「重試」的部分重試郵件聽衆N次的情況下,失敗:

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; 
}; 

使用,將它添加到onPrepare()

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 
},