2014-12-20 6 views
3

Я пытаюсь импортировать модуль AMD (модуль ES6, спрятанный в ES5) в тесте транспортира. Я использую шаблон Page Object. Объект страницы - это модуль, который я пытаюсь импортировать.Как настроить транспортир для импорта модулей AMD с requirejs

Вот код 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 

конф файл транспортир так:

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

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

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

Где я должен объявить в этом файле конфигурации, я использую requirejs для выполнения тестов?

+0

Попробуйте найти требуемые документы здесь: 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, а не браузером. Итак, я изменил параметры трейсера модулей для E2e тестов только это:

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

Я бы Recommand не transpile первых, а затем импортировать, а просто использовать ES6 в транспортире. Поместите следующее в начало файла protractor.conf.js. Теперь вы можете просто использовать операторы импорта.

Для Бабеля 6 версии поместить следующее в верхней части (или в OnPrepare) из protractor.conf.js:

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

Вы также можете использовать amdefine как сказал Мартин, но без предваряя каждый файл с
if (typeof define !== 'function') { var define = require('amdefine')(module) }

Просто включите "amdefine": ">=0.1.0" в ваших devDependencies и добавить require('amdefine/intercept'); к OnPrepare функции в транспортиром конфигурации. Он автоматически вставляет вышеуказанный фрагмент в каждый .js-файл, загруженный узлом.

Смежные вопросы