Ответ 1
В том, что вы показываете нам, происходит множество проблем. Вы неправильно используете как RequireJS, так и Mocha.
RequireJS
Я уверен, что ваш baseUrl
неверен. Кажется, вы думаете, что текущий рабочий каталог Mocha будет установлен на test/widgets/mywidget/
, когда он выполнит тесты в test/widgets/mywidget/test.js
. Это не так. Рабочий каталог находится где угодно, когда вы запускаете npm test
. Согласно вашему описанию вы находитесь в testing/
при запуске. Мне непонятно, какова ценность вашего baseUrl
, потому что вы не предоставляете достаточно информации в своем вопросе, но я надеюсь, что из объяснения, которое я вам дал, вы можете понять.
Теперь вы можете подумать: "Конечно, мой baseUrl
правильный, потому что, когда я выполняю requirejs(['mywidget/trunk/src/mywidgetfile.js'], function(myObj){
, я не получаю ошибку". Это было бы неправильным выводом. Хотя этот вызов requirejs
предусматривает загрузку вашего модуля, RequireJS не получает возможность попробовать его загрузить, потому что Mocha выходит, прежде чем RequireJS попытается загрузить его. Вы можете проверить это, заменив путь вашего модуля на полный мусор, и вы не получите ошибку.
После устранения этой проблемы baseUrl
использование var myObj = requirejs('mywidget/trunk/src/mywidgetfile.js')
будет работать так, как вы ожидаете. Таким образом, вы сможете избежать использования асинхронной формы require
(это форма, которая использует массив зависимостей в качестве первого аргумента). (Функция requirejs
, которую вы используете, является просто псевдонимом для функции, обычно называемой require
в документации RequireJS.)
Мокко
Ваши тесты не выполняются, потому что Mocha их не видит. Способ работы Mocha - это прочитать все тестовые файлы, которые он находит, а затем выполнить их. Обратные вызовы для каждого вызова describe
выполняются сразу, а обратные вызовы к каждому вызову it
записываются как тесты, которые нужно запустить. Как только Mocha закончит выяснять, какие тесты существуют, он запускает их.
Что происходит с вашим тестовым файлом, так это то, что Mocha выполняет его, как обычно. Однако в верхней части тестового файла нет вызова describe
или it
. В вашем обратном вызове есть вызовы requirejs
, но помните, что я сказал выше: RequireJS не получает возможность загрузить модуль, чтобы он не получал возможность запустить обратный вызов. (И даже если бы это запустило его, было бы слишком поздно.) Таким образом, Моча не видит никаких тестов и выходов сразу.
Путь вперед
Выясните baseUrl
, который вам нужен, и тогда это должно работать:
'use strict';
var requirejs = require('requirejs');
requirejs.config({
baseUrl: <whatever value is needed here>,
nodeRequire: require
});
var myObj = requirejs('mywidget/trunk/src/mywidgetfile.js');
describe('My Widget', function() {
// etc...
Возможно, вы также захотите полностью отказаться от RequireJS из своего тестового набора. Я написал библиотеку, которая также работает в Node, как в браузере. Он состоит из модулей AMD и загружен RequireJS в браузере, но я не использую RequireJS в наборе тестов. Это loader Я использую для загрузки своих модулей в Node. Там также amdefine, который я не использовал, но должен давать аналогичные возможности.