Mocha + RequireJS = AMD тестирование

Мне трудно подключить Mocha к приложению на основе RequireJS, возможно, вы сможете что-то придумать:). После многих часов, когда я пытался загрузить модули AMD и просто console.log, появилась некоторая "запущенная" информация о том, что модуль был загружен... ничего не произошло - программа просто закончилась и распечатала некоторую информацию о мокко.

var facade = requirejs(['../../public/js/scripts/widgets/widgets/article/main.js'],      
    function(mod) {
        console.log('fired')
});
// run with: $ mocha -u tdd test.js --reporter spec

и затем я пришел к идее запустить это для проверки обратных вызовов:

setTimeout((function() {
    console.log('fired');
}), 5000);
// run with: $ mocha -u tdd test.js --reporter spec

тоже не работал. Итак, наконец, я бегу как с

$ node test.js 

и наконец это сработало. Итак, вопрос в следующем: как запустить тест Mocha с обработкой обратных вызовов, так как они необходимы для тестирования AMD?

2 ответа

Решение

Как вы это делаете, mocha не собирается ничего делать с вашим файлом, потому что он не видит в нем набор тестов. RequireJS должен вызвать обратный вызов, но mocha завершает работу до того, как это произойдет. То же самое с вашим примером тайм-аута.

Ниже приведен пример.

файл test.js:

'use strict';
var requirejs = require("requirejs");
requirejs.config({
    baseUrl: '.',
    nodeRequire: require
});

suite('Something', function(){
    var foo;

    suiteSetup(function (done){
        // This saves the module foo for use in tests. You have to use
        // the done callback because this is asynchronous.
        requirejs(['foo'],
                  function(mod) {
            console.log("fired!");
            foo = mod;
            done();
        });
    });

  suite('blah', function(){
    test('blah', function(){
      if (foo.test !==  "test")
          throw new Error("failed!");
    });
  });
});

файл foo.js:

define(function () {
   return {test: "test"};
});

Когда вы бежите:

mocha -u tdd test.js

Вы увидите, что обратный вызов сработал, и тест прошел.

Для удобства людей, читающих этот вопрос и смущенных использованием suite, suiteSetup, test... Mocha поддерживает несколько интерфейсов. Код здесь использует интерфейс TDD (OP вызывает Mocha с -u tdd), который экспортирует suite, suiteSetup, testи т. д. В интерфейсе BDD по умолчанию эквивалентами являются describe, before а также itсоответственно.

Я настроил соответствующий шаблон для использования мокко в среде RequireJS. Это может быть не совсем то, что вы хотите, но это может быть полезно. https://github.com/x2es/boilerplate-karma-mocha-chai-requirejs

Еще одно замечание - при условии, что ваш скрипт размещен в "/public", имеет смысл протестировать его в среде браузера вместо nodejs. Для этого вам следует взглянуть на какого-нибудь тест-бегуна, такого как JsTestDriver ( https://code.google.com/p/js-test-driver/) или карма-бегун ( http://karma-runner.github.io/). Или другой...

В предоставленной документации по карме ( http://karma-runner.github.io/0.8/plus/RequireJS.html)

var tests = [];
for (var file in window.__karma__.files) {
  if (window.__karma__.files.hasOwnProperty(file)) {
    if (/Spec\.js$/.test(file)) {
      tests.push(file);
    }
  }
}

requirejs.config({
    // Karma serves files from '/base'
    baseUrl: '/base/src',

    paths: {
        'jquery': '../lib/jquery',
        'underscore': '../lib/underscore',
    },

    shim: {
        'underscore': {
            exports: '_'
        }
    },

    // ask Require.js to load these files (all our tests)
    deps: tests,

    // start test run, once Require.js is done
    callback: window.__karma__.start
});

введенный способ, когда мы заставляем requirejs предварительно загружать все необходимые spec-файлы, используя

require.config({
  deps: ['array', 'of', 'our', 'spec', 'files']
})

В этой среде каждый spec-файл должен быть обычным модулем RequireJS.

Пример тестовой спецификации для такой среды:

define(['chai'], function(chai) {
  var expect = chai.expect;

  describe('bootstrap', function() {
    it('should...', function() {
      expect('a').to.equal('a');
    });
  });
});
Другие вопросы по тегам