所以我正在使用一个企业工具,我们在其中嵌入了javascript脚本。这些脚本可以访问某些内置对象。
不幸的是,该工具没有提供任何好的方法来对这些脚本进行单元测试。所以我的想法是在回购中维护脚本,模拟内置对象,然后设置在我的系统上运行的单元测试。
我对JavaScript在构建,类加载等方面的工作方式一无所知,但我只是在尝试并看看哪些方法有效。我开始尝试将Mocha作为一个节点项目(尽管它只是一个充满脚本的目录,而不是真正的节点项目)。默认测试有效,但是当我尝试从我的代码中测试函数时,我遇到了编译器错误。
以下是我项目中的示例脚本的样子。我希望测试函数,而不是整个脚本:
var thing = builtInObject.foo();
doStuff(thing);
doMoreStuff(thing);
function doStuff(thing) {
// Code
}
function doMoreStuff(thing) {
// More Code
}
以下是测试文件的样子:
var assert = require('assert');
var sampleScript = require('../scripts/sampleScript.js');
describe('SampleScript', function() {
describe('#doStuff()', function() {
it('should do stuff', function() {
assert.equal(-1, sampleScript.doStuff("input"));
});
});
});
导入(“require”)脚本时出现问题。我得到编译错误,因为它不是builtInObject。有什么方法可以用模拟“注入”那些内置物体吗?所以我定义了那些对象包含的变量和函数,编译器知道它们是什么?
我愿意接受其他框架或想法。对不起我的无知,我不是一个真正的javascript人。我知道这有点像hacky,但它似乎是最好的选择,因为我没有退出企业工具。
答案 0 :(得分:1)
因此,如果我做对了,你想在Node.js环境中对frontened文件进行单元测试。
有一些并发症。
首先,就Node.js而言,每个文件都有自己的范围,因此即使您需要该文件,也无法访问文件内部定义的变量。因此,您需要导出变量才能使用它们。
module.exports.doStuff = doStuff; //in the end of sample script
其次,你开始在前端使用require / module.exports这样的东西,它们将被定义为未定义,这样你就会收到错误。
运行代码的最简单方法是。在示例脚本中:
var isNode = typeof module !== 'undefined' && module.exports;
if (isNode) {
//So we are exporting only when we are running in Node env.
//After this doStuff and doMoreStuff will be avail. in the test
module.exports.doStuff = doStuff;
module.exports.doMoreStuff = doMoreStuff;
}
对于builtInObject是什么。在require执行以下操作之前,模拟它的简单方法是在测试中:
global.builtInObject = {
foo: function () { return 'thing'; }
};
测试刚刚过去了。见the sources。
无论如何,全局变量并不好。但在这种情况下,你似乎无法避免使用它们。
或者你可以通过配置像Karma这样的东西来避免使用Node.js.它实际启动浏览器并在其中运行测试。 :)