JavaScripttesting(摩卡)与'import'js文件
我理解module.export
并require
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.INFINITY
和app.anyOtherValue
。
必须有一个聪明的方法。 你可以告诉我吗?
谢谢。
更新:最终答案:
我以前的答案是无效的,因为eval(code);
对variables没有用处。
幸运的是, node
有一个强大的方法 – vm
但是,根据文件,
虚拟机模块有许多已知的问题和边缘情况。 如果遇到问题或意外的行为,请参阅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'); });