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');
});
});
});