Подтвердить что ты не робот

Как проверить "нормальные" (не связанные с 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 -специфический синтаксис?

4b9b3361

Ответ 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