JavaScripttesting(摩卡)与'import'js文件

我理解module.exportrequire module.export

需要外部js文件进行摩卡testing

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

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

app.js

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

现在,我想在一个文件中testing这个代码:

test.js

 var expect = require('chai').expect; require('./app.js'); describe('INFINITY', function() { it('INFINITY === "INFINITY"', function() { expect(INFINITY) .to.equal('INFINITY'); }); }); 

testing代码执行app.js ,所以输出是;

app.js is running

然后

ReferenceError: INFINITY is not defined

这不是我所期望的。

我不想使用module.export和写

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

testing代码中的每行都app.INFINITYapp.anyOtherValue

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

谢谢。

更新:最终答案:

我以前的答案是无效的,因为eval(code); 对variables没有用处。

幸运的是, node有一个强大的方法 – vm

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

但是,根据文件,

虚拟机模块有许多已知的问题和边缘情况。 如果遇到问题或意外的行为,请参阅GitHub上的公开问题。 下面介绍一些最大的问题。

所以,虽然这表面上工作,需要额外的照顾这样的目的,如testing…

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

毕竟; 在这种情况下,我发现的最好的方法是在同一个文件中编写testing摩卡密码。

我通常包含一个_test对象,其中包含对所有“私有”内部variables和函数的引用,并将其显示在导出上。 在你的情况下:

./app.js

 var INFINITY = 'infinity'; function foo() { return 'bar'; } exports._test = { INFINITY: INFINITY, foo: foo } 

./test/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'); });