我试图在量角器测试中导入AMD模块(在ES5中编译的ES6模块)。 我正在使用Page Object模式。页面对象是我试图导入的模块。
这是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中的define()。但我从来没有声明我使用requirejs的任何地方。所以我收到以下错误:
Failures:
1) Exception loading: build/test/e2e/Hello.spec.js Error
Message:
ReferenceError: define is not defined
量角器配置文件是这样的:
exports.config = {
capabilities: {
'browserName': 'chrome'
},
specs: [ 'build/test/e2e/**/*.js'],
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000
}
};
我应该在这个配置文件中声明我使用requirejs来执行测试吗?
答案 0 :(得分:2)
解决方案是使用requirejs.org/docs/node.html#3中描述的amdefine 此解决方案的缺点是您需要通过以下行添加每个模块:
if (typeof define !== 'function') { var define = require('amdefine')(module) }
在我的具体情况下,因为我使用traceur来转换ES6文件,所以我选择使用commonjs模块而不是AMD来进行e2e测试。它与Karma(我可以轻松使用AMD)执行的单元测试的不同之处在于,量角器测试由Node.js执行,而不是由浏览器执行。 因此,我将e2e测试的traceur模块选项仅更改为:
{
"modules": "commonjs",
"script": false,
"types": true,
"annotations": true,
"memberVariables":true,
"outputLanguage": "es5"
}
答案 1 :(得分:1)
我建议不要先转换然后导入,而只是在量角器中使用ES6。将以下内容放在protractor.conf.js文件的顶部。 现在,您可以使用import语句。
对于Babel 6版本,将以下内容放在protractor.conf.js的顶部(或onPrepare):
require("babel-core/register")({
presets: [
"es2015"
]
});
答案 2 :(得分:0)
You can also use amdefine as said Martin, but without prepending each file with
if (typeof define !== 'function') { var define = require('amdefine')(module) }
Just include "amdefine": ">=0.1.0"
in your devDependencies and add require('amdefine/intercept');
to onPrepare function in your protractor config.
It will automatically insert the above snippet in each .js file loaded by Node.