2017-01-25 103 views
0

因此,我正在使用企业工具,我们在其中嵌入了JavaScript脚本。这些脚本可以访问某些内置对象。使用模拟对象在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")); 
     }); 
    }); 
}); 

问题发生。我得到编译错误,因为它不是builtInObject。有没有什么办法可以用mock“注入”那些内置的对象?所以我定义了这些对象包含的变量和函数,编译器知道它们是什么?

我接受其他框架或想法。对不起,我的无知,我不是一个真正的JavaScript家伙。而且我知道这有点冒险,但它似乎是最好的选择,因为我没有退出企业工具。

回答

1

因此,如果我正确地做到了,您希望在Node.js环境中对前端文件进行单元测试。

有一些并发症。

首先,根据Node.js,每个文件都有自己的作用域,因此即使您需要该文件,文件内定义的变量也不可访问。所以你需要输出变量来使用它们。

module.exports.doStuff = doStuff; //in the end of sample script 

其次,您在开始使用像要求他们将是不确定的,所以你会得到一个错误的前/ 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。简单的方法来嘲笑它将在测试之前,需要做以下内容:

global.builtInObject = { 
    foo: function() { return 'thing'; } 
}; 

该测试刚刚通过了我。见the sources

无论如何,全局变量并不好。但在这种情况下,你似乎无法避免使用它们。

或者你可以通过配置类似Karma来避免使用Node.js。它在物理上启动浏览器并在其中运行测试。 :)

+0

谢谢,你的方法大部分适用于我!一对夫妇跟进问题: 1。我是否也可以预定课程?有像“var builtInClass = new BuiltInClass();”的代码以及。 2.我可以模拟一个函数的返回(就像java中的mockito那么返回())?当我测试doMoreStuff时,我不想让doStuff真正被调用,但我可能需要返回值。 @ antonio-narkevich – user2014969

+0

我想我有点想出#2。使用sinon.stub我可以嘲笑doStuff()的返回。问题是,我的代码现在被编写的方式,它需要函数模拟或在require()时失败。在需求之后,嘲笑该功能需要发生。我想我可能会重构我的代码来解决这个问题。编辑:是的,我想出了一个办法。对不起,我把它变成了我的编码思想过程博客。 – user2014969

+0

嘿男人。关于#1。可能你可以做一些像globa.BuiltInClass = function(){}的东西,你会没事的。 :) –

相关问题