邮件侦听器偶尔无法通过身份验证
Mail listener ocassionally fails to authenticate
问题:
我们有多个测试,我们需要实际检查测试用户的电子邮件作为测试用例步骤。这用于双因素身份验证和电子邮件通知测试。
目前,我们使用提供的解决方案 which is based on the 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% 的情况下,邮件侦听器会失败并显示以下错误消息:
Timed out while authenticating with server
问题:
是什么导致了这个问题?我们可以做些什么来使邮件监听器正常工作?另外,是否可以在失败时重试身份验证?
这是一个异步问题。您的邮件侦听器正在尝试检查事件 "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;
});
}
@cnishina 的回答帮了大忙。我们更进一步并添加了 "retry" 部分以在失败时重试邮件侦听器 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
},
问题:
我们有多个测试,我们需要实际检查测试用户的电子邮件作为测试用例步骤。这用于双因素身份验证和电子邮件通知测试。
目前,我们使用提供的解决方案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% 的情况下,邮件侦听器会失败并显示以下错误消息:
Timed out while authenticating with server
问题:
是什么导致了这个问题?我们可以做些什么来使邮件监听器正常工作?另外,是否可以在失败时重试身份验证?
这是一个异步问题。您的邮件侦听器正在尝试检查事件 "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;
});
}
@cnishina 的回答帮了大忙。我们更进一步并添加了 "retry" 部分以在失败时重试邮件侦听器 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
},