我正在为基于 JS 库的 CLI 项目进行单元测试 https://github.com/tj/commander.js
我试图覆盖几个变量来检查正在打印帮助信息的函数。
我需要创建一个新的 Command 实例并设置变量 _alias、_name、_description
和 options
我有:
import program from 'commander';
describe('test', function() {
before(function() {
new program.Command();
program.Command.prototype._alias = 'testAlias';
program.Command.prototype._name = 'testName';
program.Command.prototype._description = 'testDescription';
});
it('first test', function() {
console.log(program);
});
});
我收到了一个没有更新变量的“旧”实例。
最佳答案
ES6 模块有一些限制,可以防止您修改它们。然而,由于还没有人支持 ES6 模块,你必须使用 Babel,而 Babel 在 CommonJS 模块系统之上实现了 ES6 模块。我相信您可以利用这一事实来使用底层 CommonJS 来修改导入:
import commander from 'commander';
commander.default.prototype._alias = 'testAlias';
//or
commander.Command._alias = 'testAlias';
从本质上讲,您正在尝试做与人们在测试中“模拟”或“ stub ”对象时所做的相同的事情(修改导入),因此适用相同的想法(以及这个 SO 问题):
关于javascript - 如何覆盖 JS 库中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41384562/