Как использовать requireJs с envjs

Кто-нибудь может дать мне несколько советов о том, как объединить шмеля с requireJs? BumbleBee объединяет Rhino, JSpec, Envjs и Ant для предоставления готового инструментария для тестирования JavaScript. Это очень полезно для нас, потому что делает возможным простой автономный запуск в терминале на Ubuntu-box.

Весь наш JS-код, основанный на requireJs-модулях, и кажется, что требуемые модули не загружаются, если они требуются из spec-файлов из envjs / bumblebee / rhine (какие вещи когда-либо могут за это отвечать) быть из-за факта асинхронности в requireJs.

Что я сделал:

  1. я установил BumbleBee-Environment, следуя инструкциям на сайте github, упомянутом выше
  2. Команда "ant examples" работает нормально, и оба теста успешно выполняются
  3. я добавил require-jquery.js к зависимостям (заменив jquery.js, который был изначально настроен) (таким образом, следует Учебное пособие "Как использовать jQuery с requireJS" - которое успешно работает во всем нашем веб-приложении (и работает нормально)
  4. я написал несколько requireJS-модулей, потребовал их в spec-файлах и очень быстро обнаружил, что они не будут загружены (spec-файлы будут загружены, а require-метод будет выполнен, но не в содержимом ins)
  5. затем я поиграл с этими подсказками по настройке для комбинирования requireJS с Node (здесь также упоминается rhino)

Эти файлы могут быть интересны:

lib / bumblebee.js (который я рассматривал как точку входа всего набора тестов):

load('dependencies/js/env.rhino.1.2.js');
window.location="examples/fixture/fixture.html";

load('dependencies/js/jspec/jspec.js');
load('dependencies/js/require-jquery.js');

var runSpec = function(spec) {
    JSpec.exec(spec);
};


define(function(require) {
    console.log("A1");
    var dep = require('dependency');

    //The value returned from the function is
    //used as the module export visible to Node.
    return function () {};
});

require(['dependency'], function(d){
    console.log("A2");
} );


console.log("A3");

var specs = arguments;


jQuery.each(specs, function(index, spec) {
    runSpec(spec);
});

JSpec
  .run({ reporter: JSpec.reporters.Terminal, fixturePath: 'spec/fixtures' })
  .report();

Только "A3" будет выводиться на консоль, код, основанный на требованиях, здесь никогда не будет выполняться.

Затем я поместил define / require-parts в spec-файлы из файлов примеров и также обнаружил, что не могу использовать модули с require, поскольку они не загружаются и не присутствуют.

Учитывая оригинальный spec-файл из BambleBee-examples:

describe('Greeter', function() {

    load('examples/src/greeter.js');

    it('greets people', function() {
      expect(example.greeter().greet()).to(eql, 'Hello!');
    });
});

Когда я сейчас использую специфичные для requireJS модули, они также не будут загружены:

describe('Greeter', function() {

    load('examples/src/greeter.js');

    require(['dependency'], function(d){
        // do something with D...
        console.log("This will **NEVER** be printed");
    } );

    console.log("This **WILL** be printed");
    it('greets people', function() {
      expect(example.greeter().greet()).to(eql, 'Hello!');
    });
});

Вопрос:

Есть ли способ объединить Envjs с requireJS или EnvJS не подходит для нас? Большое спасибо за любые подсказки!

1 ответ

Решение

Это известная проблема. Вы можете обратиться к https://github.com/envjs/env-js/issues/7 чтобы получить подробное обсуждение между envjs и requirejs. Мое решение - использовать Phantomjs для запуска спецификаций жасмина с помощью CI, и вы можете найти образец проекта по адресу https://github.com/xiaocong/xiaocong.github.com/tree/master/examples/coffee-bbb-amd-backbone-rest-contacts

Другие вопросы по тегам