Вопрос по node.js, javascript, unit-testing, mocha – Как протестировать «нормальные» (не специфичные для Node) функции JavaScript с Mocha?

45

Это похоже на этоshould быть предельно простым; однако после двух часов чтения и проб и ошибок без успеха я признаю поражение и прошу вас, ребята!

Я пытаюсь использоватькофе мокко сShould.js чтобы протестировать некоторые функции JavaScript, но я сталкиваюсь с проблемами с областью видимости. Я упростил его до самых базовых тестовых случаев, но не могу заставить его работать.

У меня есть файл с именемfunctions.js, который просто содержит следующее:

<code>function testFunction() {
    return 1;
}
</code>

И мойtests.js (находится в той же папке) содержимое:

<code>require('./functions.js')

describe('tests', function(){
    describe('testFunction', function(){
        it('should return 1', function(){
            testFunction().should.equal(1);
        })
    })
})
</code>

Этот тест не проходит сReferenceError: testFunction is not defined.

Я могу понять, почему, поскольку большинство примеров, которые я обнаружил, либо присоединяют объекты и функции к узлуglobal объект или экспортировать их с помощьюmodule.exports& # x2014; но использование любого из этих подходов означает, что мой код функции будет выдавать ошибки в стандартной ситуации браузера, где эти объекты не существуют.

Итак, как я могу получить доступ к автономным функциям, которые объявлены в отдельном файле сценария из моих тестов, без использования специфичного для Node синтаксиса?

Ты использовалexports.testFunction = testFunction в твоих functions.js? drinchev
Нет, полное содержаниеfunctions.js показаны. Пожалуйста, прочитайте вопрос еще раз & # x2014; Я специально заявляю, что яdon't хотите использовать специфичный для узла синтаксис в исходном файле. Mark Bell

Ваш Ответ

3   ответа
16
require('./functions.js')

так как вы ничего не экспортируете. Вы ожидаете, чтоtestFunction глобально доступны, по сути, так же, как

global.testFunction = function() {
    return 1;
}

Ты толькоcan't обойти механизм экспорта / глобальные. Это способ, которым был разработан узел. Не существует неявного глобального общего контекста (например,window в браузере). Каждый & quot; глобальный & quot; переменная в модуле захвачена в его контексте.

Вы должны использоватьmodule.exports, Если вы намереваетесь поделиться этим файлом с браузером, есть способы сделать его совместимым. Для быстрого взлома просто сделайwindow.module = {}; jQuery.extend(window, module.exports) в браузере илиif (typeof exports !== 'undefined'){ exports.testFunction = testFunction } для узла.

@MarkBell Три года спустя, но .. сегодня проводилось тестирование браузера с Mocha, используяgithub.com/nathanboktae/mocha-phantomjs , PhantomJS - это полностью автономный браузер, поэтому нет необходимости вводить какие-либо операторы экспорта.
Вы можете попробовать Qunit (docs.jquery.com/Qunit ) для тестирования в браузере или zombie.js (github.com/assaf/zombie) для имитации среды браузера в мокко.
@MarkBell Mocha должен нормально работать в браузере, в этом случае вам не нужноexports.
Хорошо, это имеет смысл, спасибо. Так неужели Mocha не предназначен для тестирования не-Node JS? Оно не упоминает, что где-либо в любом из документов или учебных пособий, с которыми я сталкивался. Mark Bell
26

Хотя одна вещь, о которой не было упомянуто, возможно, потому что это общеизвестно среди 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);
        })
    })
})
6

вы должны использовать

module.exports

Как Вам известно ;)

есть решение, если вы хотите использовать модуль в Node и в браузере, выполнив это

function testFunction() { /* code */ }

if (typeof exports !== 'undefined') {
   exports.testFunction = testFunction
}

сделав это, вы сможете использовать файл в браузере и в среде узла

Спасибо, это полезно. Mark Bell

Похожие вопросы