2016-12-22 4 views
2

Das Problem zu authentifizieren:Mail-Hörer nicht ocassionally

Wir haben mehrere Tests, bei denen wir tatsächlich benötigen, um den E-Mail als Testfall Schritt des Testbenutzers zu überprüfen. Dies wird für Zwei-Faktor-Authentifizierung und E-Mail-Benachrichtigungstests verwendet.

Momentan verwenden wir die mitgelieferte Lösung here, die auf der basiert. Hier ist die Konfiguration, die wir verwenden:

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

Wir initialisieren den Mail-Hörer in dem Protractor Config in der onPrepare() Funktion:

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; 

Das Problem ist - in etwa 10% der Zeit, die E-Mail Hörer schlägt mit der folgenden Fehlermeldung:

Zeitüberschreitung beim mit Server-Authentifizierung

Die Frage:

Was kann das Problem verursachen und was können wir die E-Mail Zuhörer Arbeit tun, um? Wäre es auch möglich, die Authentifizierung bei einem Fehler erneut zu versuchen?

Antwort

2

Dies ist ein asynchrones Problem. Ihr E-Mail-Listener versucht, nach einem Ereignis "Server: verbunden" zu suchen. Da dies asynchron ist, kann dies zeitlich passieren oder nicht. Was Sie versuchen sollten, ist dies in ein Versprechen einzubinden und nach dem Ereignis "server: connected" zu lösen.

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

Danke, macht den Meister Sinn! Ich werde sehen, ob ich das verbessern kann, indem ich den "Wiederholungs" -Teil hinzufüge. – alecxe

+1

Posted, was wir für Wiederholungen in einer separaten Antwort verwenden. Bitte sehen Sie, ob wir es vereinfachen oder verbessern können. Danke noch einmal! – alecxe

1

@ cnishnas Antwort hat sehr geholfen. Wir haben es ein bisschen weiter und hinzugefügt, um das „Wiederholen“ Teil Mail Hörer N-mal im Fall erneut zu versuchen, es scheitert:

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

Verwendung, fügen Sie diese zu 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 
},