使用模拟对象在JavaScript中进行单元测试

时间:2017-01-25 23:16:51

标签: javascript unit-testing

所以我正在使用一个企业工具,我们在其中嵌入了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,但它似乎是最好的选择,因为我没有退出企业工具。

1 个答案:

答案 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.它实际启动浏览器并在其中运行测试。 :)