2014-12-20 57 views
3

我想在量角器測試中導入一個AMD模塊(在ES5中傳輸的ES6模塊)。 我正在使用Page Object模式。而頁面對象是我試圖導入的模塊。如何設置量角器導入與requirejs的AMD模塊

這裏是ES6代碼:

import {HelloPage} from 'HelloPage'; 

describe('The demo app', function() { 

    beforeEach(function() { 
    browser.get('http://localhost:3000/index.html'); 
    }); 

    it('should say hello',function(){ 
    var helloPage = new HelloPage(); 
    helloPage.setFirstName('Martin'); 
    helloPage.submit(); 
    // then, expect statement. 
    }) 

}); 

生成的ES5代碼如下所示:

define(['HelloPage'], function($__0) { 
    "use strict"; 
    if (!$__0 || !$__0.__esModule) 
    $__0 = {default: $__0}; 
    var HelloPage = $__0.HelloPage; 
    describe('The demo app', function() { 
    beforeEach(function() { 
     browser.get('http://localhost:3000/index.html'); 
    }); 
    it('should say hello', function() { 
     var helloPage = new HelloPage(); 
     helloPage.setFirstName('Martin'); 
     helloPage.submit(); 
    }); 
    }); 
    return {}; 
}); 

的問題是我使用的定義的事實()從requirejs。但是我從未在任何地方聲明過我使用requirejs。所以,我得到以下錯誤:

Failures: 

    1) Exception loading: build/test/e2e/Hello.spec.js Error 
    Message: 
    ReferenceError: define is not defined 

量角器的conf文件是這樣的:

exports.config = { 
    capabilities: { 
    'browserName': 'chrome' 
    }, 

    specs: [ 'build/test/e2e/**/*.js'], 

    jasmineNodeOpts: { 
    showColors: true, 
    defaultTimeoutInterval: 30000 
    } 
}; 

,我應該在我使用requirejs來執行測試這個配置文件中聲明?

+0

試試看看這裏的requirejs文檔:http://requirejs.org/docs/node.html#2 –

+0

感謝您的評論@AndrewEisenberg,它幫助我找到解決方案。 – Martin

回答

2

一個解決方案是使用amdefine,因爲它是在這個解決方案中requirejs.org/docs/node.html#3 缺點描述的是,你需要通過下面一行前面加上每個模塊:

if (typeof define !== 'function') { var define = require('amdefine')(module) } 

在我的具體情況,因爲我m使用traceur轉儲ES6文件,我選擇使用commonjs模塊而不是AMD進行e2e測試。這與Karma執行的單元測試(我可以輕鬆使用AMD)不同的原因是量角器測試由Node.js而不是由瀏覽器執行。 於是,我改變了端對端測試traceur模塊選項只有這樣:

{ 
     "modules": "commonjs", 
     "script": false, 
     "types": true, 
     "annotations": true, 
     "memberVariables":true, 
     "outputLanguage": "es5" 
} 
1

我也不會推薦給transpile,然後再進口,但只使用ES6的量角器。把下面放在protractor.conf.js文件的頂部。 現在,您可以使用導入語句。

對於巴貝爾6版本把頂部的protractor.conf.js的下面(或者onPrepare):

require("babel-core/register")({ 
    presets: [ 
     "es2015" 
    ] 
}); 
0

您還可以使用amdefine爲馬丁說,但沒有預先考慮每個文件與
if (typeof define !== 'function') { var define = require('amdefine')(module) }

只需在您的devDependencies "amdefine": ">=0.1.0"並添加require('amdefine/intercept'); 到onPrepare功能在你的量角器配置。 它會自動在Node加載的每個.js文件中插入上面的代碼片段。

相關問題