2017-07-25 70 views
1

我有一個測試分爲3個組件。主頁面對象頁面,頁面有問題的HomePage和測試本身。最新的module.exports的目的是什麼?

我想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; 

==

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(); 
    ... 

讚賞任何幫助。 p.s.使用nodejs,webdriverio,mocha和chai。

回答

2

當你寫:

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

變量Page是從出口任何 '../page-models/Page' 與module.exports。如果您導出new Page()對象,那麼您的變量Page將是您使用new創建的Page類的實例,而不是類本身。而且你不能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() 

哪個更詳細,但也使您的模塊更加靈活。