使用'import'js文件进行JavaScript测试(mocha)

时间:2014-01-29 03:49:36

标签: javascript node.js unit-testing require mocha

我理解module.exportrequire mannner:

Requiring external js file for mocha testing

虽然只要它是一个模块就可以使用它,但我觉得这种方式不方便,因为我现在打算做的是测试文件中的代码。

例如,我在文件中有一个代码:

app.js

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

现在,我想在一个文件中测试这段代码:

test.js

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

require('./app.js');


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

测试代码执行app.js,因此输出为;

app.js is running

然后

ReferenceError: INFINITY is not defined

这不是我的预期。

我不想使用module.export并且写得像

var app = require('./app.js');

对于测试代码中的每一行,

app.INFINITYapp.anyOtherValue

必须有一种聪明的方式。你能告诉我吗?

感谢。

2 个答案:

答案 0 :(得分:14)

更新:最终答案:

我之前的回答无效,因为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');
            })
    });

});

全部; 我在这种情况下找到的最好方法是 将测试mocha代码写在同一个文件中。

答案 1 :(得分:4)

我通常包含一个_test对象,其中包含对我所有“私有”内部变量和函数的引用,并在导出时公开它。在你的情况下:

<强> ./ app.js

var INFINITY = 'infinity';

function foo() {
    return 'bar';
}

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

<强> ./测试/ APP-test.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');
});