gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:09:58 24 4
gpt4 key购买 nike

所以我正在使用一个企业工具,我们在其中嵌入了 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。有什么方法可以用模拟“注入(inject)”那些内置对象吗?所以我定义了这些对象包含的变量和函数,编译器知道它们是什么?

我对替代框架或想法持开放态度。抱歉我的无知,我不是一个真正的 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'; }
};

我刚刚通过了测试。请参阅the sources

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

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

关于javascript - 使用模拟对象在 JavaScript 中进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41863448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com