如何设置量角器以使用requirejs导入AMD模块

时间:2014-12-20 23:32:41

标签: requirejs protractor amd

我试图在量角器测试中导入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来执行测试吗?

3 个答案:

答案 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.