Javascript mailListner-无法读取属性';在';未定义的

Javascript mailListner-无法读取属性';在';未定义的,javascript,email,protractor,e2e-testing,Javascript,Email,Protractor,E2e Testing,我正在使用下面的库进行E2E量角器的测试,并且也是基于这个库中的信息,看起来非常好 我面临的问题是关于函数getlastmail(): 当我运行测试时,我不断得到错误: -失败:无法读取未定义的属性“on” 看起来mailListner未定义 以下是调用函数的部分: describe('sales App', () => { it('Should send confirmation email', () => { browser.controlFlow().wai

我正在使用下面的库进行E2E量角器的测试,并且也是基于这个库中的信息,看起来非常好

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

当我运行测试时,我不断得到错误:
-失败:无法读取未定义的属性“on”

看起来
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);

            });
   });
});
量角器.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()
}

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

我猜它引用了这一行,
mailListener.on(“mail”…
),所以您的
mailListener
没有定义

如果您最初遵循并在配置中实例化mailListener,您会注意到他们为
mailListener
创建了一个全局函数,该函数在调用
getLastEmail
时可用

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

// 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) {...

是的,我在函数中定义了mailstener:
onPrepare()
,在
spec.ts
中,我在
描述(…)之前的顶部有函数
getlastmail()
。那么它对
spec.ts
文件不可用吗?不知为什么它不可用!请在实例化邮件列表的
onPrepare
块中发布我添加了
onPrepare()
gragrator.conf.js中的block,谢谢,那里看起来不错。你也在使用TypeScript吗?也许编译时它缺少全局引用?你也可以尝试将mailListener移动到规范级别并在那里实例化,然后它肯定是可用的Eyes,TypeScript-这是一个角度应用程序。我检查了这个帖子ng关于全局变量,并将它们从
grandor.conf.js
传递到
spec
文件:,但没有帮助。我还尝试将
mailstener
直接导入
spec
中,就像
import{mailstener}从“../../dragrator.conf.js”;
但是我说:
/dragrator.conf.js',但是“--allowJs”没有设置
,这很清楚它的意思。
// 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) {...