我理解module.export
和require
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.INFINITY
和app.anyOtherValue
。
必须有一种聪明的方式。你能告诉我吗?
感谢。
答案 0 :(得分:14)
更新:最终答案:
我之前的回答无效,因为eval(code);
对变量没用。
幸运的是,node
有一个强大的方法 - vm
然而,根据文件,
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');
});