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

13 javascript unit-testing require mocha.js node.js

我理解module.exportrequire管理者:

需要外部js文件进行mocha测试

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

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

app.js

'use strict';
console.log('app.js is running');
var INFINITY = 'INFINITY';
Run Code Online (Sandbox Code Playgroud)

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

test.js

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

require('./app.js');


    describe('INFINITY', function()
    {
        it('INFINITY === "INFINITY"',
            function()
            {
                expect(INFINITY)
                    .to.equal('INFINITY');
            });
    });
Run Code Online (Sandbox Code Playgroud)

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

app.js is running

然后

ReferenceError: INFINITY is not defined

这不是我的预期.

我不想用module.export和写的一样

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

app.INFINITY并且app.anyOtherValue对于测试代码中的每一行.

必须有一个聪明的方法.你可以告诉我吗?

谢谢.

小智 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');
            })
    });

});
Run Code Online (Sandbox Code Playgroud)

毕竟; 我在这种情况下找到的最好的方法是在同一个文件中编写测试mocha代码.


Jay*_*com 5

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

./app.js

var INFINITY = 'infinity';

function foo() {
    return 'bar';
}

exports._test = {
    INFINITY: INFINITY,
    foo: foo
}
Run Code Online (Sandbox Code Playgroud)

./test/app-test.js

var INFINITY = 'infinity';

function foo() {
    return 'bar';
}

exports._test = {
    INFINITY: INFINITY,
    foo: foo
}
Run Code Online (Sandbox Code Playgroud)