Как проверить "нормальные" (не связанные с w630) функции JavaScript с помощью Mocha?
Кажется, что это должно быть предельно просто; однако, после двух часов чтения и проб и ошибок без успеха, я допускаю поражение и спрашиваю вас, ребята!
Я пытаюсь использовать Mocha с Should.js, чтобы проверить некоторые функции JavaScript, но я сталкиваюсь с проблемами определения области. Я упростил его до самых основных тестовых примеров, но я не могу заставить его работать.
У меня есть файл с именем functions.js
, который содержит только следующее:
function testFunction() {
return 1;
}
И содержимое tests.js
(находится в той же папке):
require('./functions.js')
describe('tests', function(){
describe('testFunction', function(){
it('should return 1', function(){
testFunction().should.equal(1);
})
})
})
Этот тест завершился неудачно с ReferenceError: testFunction is not defined
.
Я вижу, почему, потому что большинство примеров, которые я нашел, присоединяют объекты и функции к объекту Node global
или экспортируют их с помощью module.exports
, но используя любой из этих подходов означает, что мой код функции будет бросить ошибки в стандартной ситуации браузера, где эти объекты не существуют.
Итак, как я могу получить доступ к автономным функциям, объявленным в отдельном файле script из моих тестов, не используя Node -специфический синтаксис?
Ответы
Ответ 1
require('./functions.js')
Это ничего не делает, поскольку вы ничего не экспортируете. Вы ожидаете, что testFunction
доступен по всему миру, по существу, такой же, как
global.testFunction = function() {
return 1;
}
Вы просто не можете обойти механизм export/globals. Это было разработано как node. Не существует неявного глобального общего контекста (например, window
в браузере). Каждая "глобальная" переменная в модуле попадает в контекст.
Вы должны использовать module.exports
. Если вы собираетесь поделиться этим файлом в среде браузера, есть способы сделать его совместимым. Для быстрого взлома выполните window.module = {}; jQuery.extend(window, module.exports)
в браузере или if (typeof exports !== 'undefined'){ exports.testFunction = testFunction }
для node.
Ответ 2
Благодаря другим ответам здесь у меня все работает.
Одна вещь, о которой не упоминалось, возможно, потому, что она была общеизвестной среди Noders, заключалась в том, что вам нужно назначить результат вызова require
переменной, чтобы вы могли ссылаться на нее при вызове экспортированных функций из набора тестов.
Здесь мой полный код, для справок в будущем:
functions.js
function testFunction () {
return 1;
}
// If we're running under Node,
if(typeof exports !== 'undefined') {
exports.testFunction = testFunction;
}
tests.js
var myCode = require('./functions')
describe('tests', function(){
describe('testFunction', function(){
it('should return 1', function(){
// Call the exported function from the module
myCode.testFunction().should.equal(1);
})
})
})
Ответ 3
Если вы хотите, чтобы любой модуль был доступен через запрос, вы должны использовать
module.exports
как вы знаете;)
существует решение, если вы хотите использовать модуль в Node и в браузере, выполнив это
function testFunction() { /* code */ }
if (typeof exports !== 'undefined') {
exports.testFunction = testFunction
}
сделав это, вы сможете использовать этот файл в браузере и в среде Node