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?


person Oskar Szura    schedule 09.12.2013    source источник


Ответы (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 соответственно.

person Louis    schedule 09.12.2013
comment
Не только done, см. абзац, который я добавил в начало ответа. Mocha не увидел набор тестов в файле и сразу же вышел. - person Louis; 09.12.2013

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

Еще одно замечание — если ваш скрипт размещен в «/public», имеет смысл протестировать его в среде браузера, а не в nodejs. Для этого вам следует взглянуть на какой-нибудь тест-раннер, такой как JsTestDriver (https://code.google.com/p/js-test-driver/) или karma-runner (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');
    });
  });
});
person x'ES    schedule 09.12.2013
comment
Я думаю, что это решение тоже нормально, но оно использует «чай», и я хочу пока справиться с ним без «обещаний». Но спасибо за старание :). - person Oskar Szura; 09.12.2013