【问题标题】:mailListner - Cannot read property 'on' of undefinedmailListner - 无法读取未定义的属性“on”
【发布时间】:2018-02-01 12:30:11
【问题描述】:

我正在使用以下 mailListner 库进行 E2E Protractor 测试,并且还基于来自这个看起来相当不错的 posting 的信息。

我面临的问题是关于函数getLastEmail()

import { mailListener } from 'mail-listener2';

function getLastEmail() {
    const deferred = protractor.promise.defer();
    console.log("Waiting for an email...");

    mailListener.on("mail", function(mail){
        deferred.fulfill(mail);
    });
    return deferred.promise;
}

当我运行测试时,我不断收到错误消息: - Failed: Cannot read property 'on' of undefined

看起来 mailListner 未定义。

这里是函数被调用的部分:

describe('sales App', () => {
   it('Should send confirmation email', () => {

      browser.controlFlow().wait(getLastEmail())
            .then((email) => {
                expect(email['subject']).toEqual("Confirm Registration");
                expect(email['headers'].to).toEqual("firstName@yyy.com");
                const pattern = /Registration code is: (\w+)/g;
                const regCode = pattern.exec(email['text'])[1];
                console.log(regCode);

            });
   });
});

protractor.confi.js:

onPrepare() {
    require('ts-node').register({
        project: 'e2e/tsconfig.e2e.json'
    });
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));

    var MailListener = require("mail-listener2");
    // here goes your email connection configuration
    var mailListener = new MailListener({
        username: "myEmail@yyyy.com",
        password: "MyPassword",
        host: "imap.gmail.com",
        port: 993, // imap port 
        tls: true,
        tlsOptions: { rejectUnauthorized: false },
        mailbox: "INBOX", // mailbox to monitor 
        searchFilter: ["UNSEEN", "FLAGGED"], // the search filter being used after an IDLE notification has been retrieved 
        markSeen: true, // all fetched email willbe marked as seen and not fetched next time 
        fetchUnreadOnStart: true, // use it only if you want to get all unread email on lib start. Default is `false`, 
        mailParserOptions: { streamAttachments: true }, // options to be passed to mailParser lib. 
        attachments: true, // download attachments as they are encountered to the project directory 
        attachmentOptions: { directory: "attachments/" } // specify a download directory for attachments 
    });

    mailListener.start()

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

    mailListener.on("error", function(err) {
        console.log(err)
    })

    mailListener.on("server:disconnected", function() {
        console.log("imapDisconnected")
    })

    global.mailListener = mailListener


},
onCleanUp: function() {
    mailListener.stop()
}

知道如何解决和修复它吗?

【问题讨论】:

    标签: javascript email protractor e2e-testing


    【解决方案1】:

    我猜它引用了这一行,mailListener.on("mail"...,所以你的mailListener 是未定义的。

    如果您最初关注this answer 并在您的配置 中实例化mailListener,您会注意到他们为mailListener 创建了一个全局变量,当函数getLastEmail 被调用时可以使用它。

    或者,如果您在 specs 中执行此操作(即在 beforeAll 块中),您仍然会在实例化它时创建一个引用 mailListener 的变量,然后将其传递给函数。

    // page objects
    getLastEmail = function (serv) {
        var deferred = protractor.promise.defer();
        console.log("Waiting for an email...");
    
        serv.on("mail", function(mail){
            console.log('Email received, parsing...');
            deferred.fulfill(mail);
        });
        return deferred.promise;
    };
    
    // specs
    const MailListener = require("mail-listener2");
    mailListener = new MailListener({...
    browser.wait(Util.getLastEmail(mailListener), 30000).then(function (mail) {...
    

    【讨论】:

    • 是的,我确实在函数onPrepare() 中的protractor.conf.js 中定义了mailListener,在spec.ts 中我确实在describe(....) 之前的顶部有函数getLastEmail ()。那么它对spec.ts 文件不可用吗?不知怎的,它不可用!
    • 请张贴onPrepare 块,您正在实例化mailListener
    • 我已经从protractor.conf.js添加了onPrepare()
    • 好的,谢谢,那里看起来不错。你也在使用 TypeScript 吗?也许它在编译时缺少那个全局引用?您也可以尝试将 mailListener 移动到规范级别并在那里实例化它,那么它肯定是可用的
    • 是的,TypeScript - 这是一个有角度的应用程序。我检查了这篇关于全局变量的帖子,并将它们从protractor.conf.js 传递到spec 文件:link,但它没有帮助。而且我还尝试将mailListener 直接导入spec,例如import { mailListener } from '../../protractor.conf.js';,但我说:/protractor.conf.js', but '--allowJs' is not set,这很清楚它的含义。
    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 2018-12-17
    • 2016-06-30
    • 2016-05-09
    • 2017-03-24
    • 1970-01-01
    • 2017-08-05
    • 2016-07-18
    相关资源
    最近更新 更多