使用 Jest,获取内部函数

Using Jest, getting internal function

我正在重新审视 Jest,因为它收到了很多好评。然而,努力寻找一种访问内部功能的好方法来测试它们。

所以如果我有:

const Add2 = (n)=> n+2;

export default (list)=>{
  return list.map(Add2());
}

然后,如果我使用 Jasmine 或 Mocha,我会使用 rewire 或 babel-plugin-rewire 来获取内部 Add2 函数,如下所示:

var rewire = require('rewire');
var Add2 = rewire('./Adder').__get__('Add2');

it('Should add 2 to number', ()=>{
  let val = Add2(1);
  expect(val).toEqual(3);
});

然而,它们似乎都不能与 jest 一起工作,虽然看起来像是一个很好的模拟语法,但我看不到任何获取内部函数的方法。

有什么好的方法可以做到这一点吗?我开玩笑说缺少的东西 api 或设置?

开玩笑是不可能的。此外,您不应测试模块的内部结构,而应仅测试 public API,因为这是其他模块使用的内容。他们不关心Add2是如何实现的只要yourModule([1,2,3])returns[3,4,5].

如果你愿意在每次测试前使用 babel 转换你的文件,你实际上可以实现这一点。这是您需要做的(我假设您知道如何启动 babel 和 运行,如果不知道,那么有多个教程可供使用):

首先,我们需要安装 babel-jest plugin for jest, and babel-plugin-rewire for babel:

npm install --save-dev babel-jest babel-plugin-rewire

然后你需要添加一个.babelrc文件到你的根目录。它应该看起来像这样:

{
  "plugin": ["rewire"]
}

应该就是这样(假设您已正确设置 babel)。 babel-jest 将自动选择 .babelrc,因此除非您已经有其他转换,否则不需要额外的配置。 Babel 将在 jest 运行它们之前转换所有文件,而 speedskate 的 rewire 插件将负责通过 rewire API.

暴露模块的内部结构。

我为这个问题苦恼了一段时间,我认为这个问题不是 Jest 特有的。

我知道这并不理想,但在很多情况下,我实际上只是决定导出内部函数,只是为了测试目的:

export const Add2 = x => x + 2;

以前,我 讨厌 更改我的代码的想法,只是为了进行测试 possible/easier。直到我了解到这是硬件设计中的一个重要实践;他们将某些连接点添加到他们正在设计的硬件中,这样他们就可以测试它是否正常工作。他们正在更改设计以方便测试

是的,您完全可以使用重新布线之类的方法来做到这一点。在我看来,使用此类工具引入的额外复杂性(以及随之而来的精神开销)不值得拥有 "more correct" 代码。

这是一个权衡,我重视测试和简单性,所以对我来说,导出私有函数用于测试目的是可以的。