javascript - 如何覆盖 JS 库中的变量

标签 javascript node.js unit-testing

我正在为基于 JS 库的 CLI 项目进行单元测试 https://github.com/tj/commander.js

我试图覆盖几个变量来检查正在打印帮助信息的函数。

我需要创建一个新的 Command 实例并设置变量 _alias、_name、_descriptionoptions

我有:

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 问题):

How to mock dependencies for unit tests with ES6 Modules

关于javascript - 如何覆盖 JS 库中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41384562/

相关文章:

javascript - Mithril : render one DOM element bases on another

javascript - 不能在新函数或语法中使用前一个函数的变量?

javascript - 使用jquery和<audio>更改歌曲

javascript - nodejs 异步等待流程无法正常工作

javascript - Mongoose:我的 findByIdAndUpdate 有什么问题吗?

unit-testing - TeamCity VSTest 2015

java - 模拟空对象而不传递它们

javascript - 如何模糊网站而不使网站 "clickable"?

node.js - 我如何在 ejs 中循环访问此引用数据(标记的剧集)

c# - 单元测试 (C#)