什么是module.exports中新功能的目的?

时间:2017-07-25 06:58:58

标签: javascript node.js ecmascript-6

我将测试分为3个组件。主页面对象页面,有问题的页面主页和测试本身。

我希望Page扩展module.exports = new Page()个对象。但是我发现 - 如果在Page类中我使用:

ERROR: Class extends value #<Page> is not a function or null

我收到错误module.exports = Page

然而,如果我使用

HomePage

效果很好。

有人可以解释一下为什么会这样吗?是因为Page对象本身只是构造成每个页面的父节点,例如, LoginPageclass Page { constructor() { this.title = 'My Page'; } open(path) { browser.url('/' + path); } } module.exports = Page; 或其他任何网页?

var Page = require('../page-models/Page');

class HomePage extends Page {
    get username()  { return browser.element('#username'); }

    open() {
        super.open('');
    }

}

module.exports = new HomePage();

==

var HomePage = require('../page-models/home.page');

describe('Something great', function(){

  it('tests this', function(){
    HomePage.open();
    ...

==测试本身

dumpbin /exports Test.dll

任何帮助表示赞赏。 附:使用nodejs,webdriverio,mocha和chai。

1 个答案:

答案 0 :(得分:3)

当你写:

var Page = require('../page-models/Page');

变量Page是您从&#39; ../ page-models / Page&#39;与module.exports。如果您导出new Page()对象,那么您的变量Page将是您使用Page创建的new类的实例,而不是类本身。你不能extend一个实例。此外,require()会缓存它的结果,因此您始终可以获得相同的对象。

正如您使用module.exports = Page一样,您可以导出该类,而任何人require - 可以自由地创建他们认为合适的实例。

我知道你没有问过,但要考虑的一件事是与你的班级建立一个统一的界面。如果要导出Page类并要求用户实例化或扩展该类,则应考虑对Homepage执行相同操作。也许你可能想做类似的事情:

var Homepage = require('../page-models/home.');
class MobileHomePage extends Homepage {
    //...
}

使用new HomePage()导出实例时,您无法做到这一点。这意味着您需要在测试中使用以下内容创建实例:

var HomePageClass = require('../page-models/home.page');
var Homepage = new HomePageClass()

更冗长,但也使您的模块更加灵活。