Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中使用模拟对象的单元测试_Javascript_Unit Testing - Fatal编程技术网

JavaScript中使用模拟对象的单元测试

JavaScript中使用模拟对象的单元测试,javascript,unit-testing,Javascript,Unit Testing,因此,我正在使用一个企业工具,我们在其中嵌入了javascript脚本。这些脚本可以访问某些内置对象 不幸的是,该工具没有提供任何好的方法来对这些脚本进行单元测试。所以我的想法是在repo中维护脚本,模拟内置对象,然后设置在我的系统上运行的单元测试 我不知道JavaScript在构建、类加载等方面是如何工作的,但我只是尝试了一些东西,看看什么是有效的。我开始尝试Mocha,将其作为一个节点项目(尽管它只是一个充满脚本的目录,而不是一个真正的节点项目)。默认测试可以工作,但当我尝试从代码中测试函数

因此,我正在使用一个企业工具,我们在其中嵌入了javascript脚本。这些脚本可以访问某些内置对象

不幸的是,该工具没有提供任何好的方法来对这些脚本进行单元测试。所以我的想法是在repo中维护脚本,模拟内置对象,然后设置在我的系统上运行的单元测试

我不知道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"));
         });
     });
 });
当我导入(“需要”)脚本时会出现问题。我得到编译错误,因为它没有内置对象。我有没有办法用mock“注入”那些内置对象?所以我定义了这些对象包含的变量和函数,编译器知道它们是什么


我对其他框架或想法持开放态度。对不起我的无知,我不是一个真正的javascript人。我知道这有点黑客,但这似乎是最好的选择,因为我不会退出企业工具

因此,如果我没有弄错,您希望在Node.js环境中对前面的文件进行单元测试

有一些并发症

首先,对于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;
}
为这个建筑项目做些什么。模拟它的简单方法是在测试内部,然后要求执行以下操作:

global.builtInObject = {
    foo: function () { return 'thing'; }
};
我刚刚通过了考试。看

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


或者,您可以通过配置类似Karma的内容来避免使用Node.js。它实际启动浏览器并在其中运行测试。:)

谢谢,你的方法在很大程度上适合我!几个后续问题:1。我也可以预定义一个类吗?还有类似“var builtInClass=newbuiltinclass();”的代码。2.我可以模拟函数的返回(比如java mockito中的thenReturn())吗?当我测试domorseuff时,我不希望doStuff实际被调用,但我可能需要它的返回值@安东尼奥·纳克维奇(antonio narkevichI)认为我有点明白了。使用sinon.stub,我可以模拟doStuff()的返回。问题是,按照我现在编写代码的方式,它需要模拟函数,否则它会在require()处失败。模拟函数需要在需求之后进行。我想我可以重构我的代码来解决这个问题。编辑:是的,我想出了一个办法。很抱歉把这个变成了我的编码思维过程博客。关于#1。也许你能做一些类似globa.BuiltInClass=function(){}的事情,你会没事的。:)