Тест JavaScript (mocha) с файлом JS " импорт

Я понимаю module.export и require mannner:

требуется внешний JS-файл для тестирования мокко

хотя это довольно удобно, пока это модуль, я чувствую, что этот способ неудобен, так как то, что я намерен сделать сейчас, это проверить код в файле.

например, у меня есть код в файле:

app.js

'use strict';
console.log('app.js is running');
var INFINITY = 'INFINITY';

и теперь, я хочу проверить этот код в файл:

2 ответов


UPDATE: ОКОНЧАТЕЛЬНЫЙ ОТВЕТ:

мой предыдущий ответ недействителен, так как eval(code); не используется для переменных.

к счастью, node имеет сильный метод - vm

http://nodejs.org/api/vm.html

однако, согласно Доку,

модуль vm имеет много известных проблем и крайних случаев. Если вы столкнулись с проблемами или неожиданным поведением, обратитесь к открытым вопросам на GitHub. Некоторые из самых больших проблемы описаны ниже.

Итак, хотя это работает на поверхности, дополнительная забота необходима для такой цели, как тестирование...

var expect = require('chai')
    .expect;

var fs = require('fs');
var vm = require('vm');
var path = './app.js';

var code = fs.readFileSync(path);
vm.runInThisContext(code);

describe('SpaceTime', function()
{
    describe('brabra', function()
    {
        it('MEMORY === "MEMORY"',
            function()
            {
                expect(MEMORY)
                    .to.equal('MEMORY');
            })
    });

});

ПОСЛЕ ВСЕХ; Лучший способ, который я нашел в этом случае - написать тестовый код мокко в том же файле.


Я, как правило, включают в себя _test объект, содержащий ссылки на все мои "личные" внутренние переменные и функции и выставить его на экспорт. В вашем случае:

./приложение.js

var INFINITY = 'infinity';

function foo() {
    return 'bar';
}

exports._test = {
    INFINITY: INFINITY,
    foo: foo
}

./ test / app-тест.js

var app = require('../app.js')
/* ... */
it('should equal bar', function() {
    expect(app._test.foo()).to.equal('bar');
});
it('should equal infinity', function() {
    expect(app._test.INFINITY).to.equal('infinity');
});