module.exports中new的目的是什么?

use*_*od2 2 javascript node.js ecmascript-6

我的测试分为3个部分。主页对象Page,有问题的页面HomePage和测试本身。

我想HomePage扩展Page对象。但是我发现的是-如果在Page类中使用:

module.exports = new Page()

我得到错误 ERROR: Class extends value #<Page> is not a function or null

但是如果我用

module.exports = Page

它完美地工作。

有人可以解释为什么会这样吗?是因为Page对象本身仅由其父页面(例如HomePageLoginPage其他页面)构成的每个页面构成?

class Page {
constructor() {
        this.title = 'My Page';
    }
    open(path) {
        browser.url('/' + path);
    }
}
module.exports = Page;
Run Code Online (Sandbox Code Playgroud)

==

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

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

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

}

module.exports = new HomePage();
Run Code Online (Sandbox Code Playgroud)

==测试本身

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

describe('Something great', function(){

  it('tests this', function(){
    HomePage.open();
    ...
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*yer 5

当你写:

var Page = require('../page-models/Page');
Run Code Online (Sandbox Code Playgroud)

该变量Page是您使用'../page-models/Page'导出的任何变量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 {
    //...
}
Run Code Online (Sandbox Code Playgroud)

您无法使用导出实例new HomePage()。这意味着您将需要在测试中使用以下方式创建实例:

var HomePageClass = require('../page-models/home.page');
var Homepage = new HomePageClass()
Run Code Online (Sandbox Code Playgroud)

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