使用Jest,获取内部功能

时间:2017-01-23 10:12:21

标签: javascript unit-testing jestjs

我只是在重新审视Jest,因为它获得了很多好的报道。然而,努力寻找访问内部函数来测试它们的好方法。

所以,如果我有:

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

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

然后,如果我使用Jasmine或Mocha,我会使用重新连接或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,虽然看起来像一个很好的模拟语法,但我看不到任何获得内部函数的方法。

有没有一种好方法可以做到这一点,我在jest api或设置中缺少的东西?

3 个答案:

答案 0 :(得分:1)

如果您愿意在每次测试之前使用babel转换文件,那么您实际上可以实现此目的。这就是你需要做的事情(我假设你知道如何让babel自己运行起来,如果不是有多个可用的教程):

首先,我们需要为jest安装babel-jest plugin,为babel安装babel-plugin-rewire

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

然后,您需要将.babelrc文件添加到根目录。看起来应该是这样的:

{
  "plugin": ["rewire"]
}

这应该是它(假设你正确设置了babel)。 babel-jest将自动选择.babelrc,因此除非您已经有其他变换,否则不需要其他配置。 Babel将在开玩笑之前转换所有文件,而speedskater的重新布线插件将通过重新布线API来处理模块的内部。

答案 1 :(得分:1)

我一直在努力解决这个问题,我不认为问题是针对Jest的。

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

export const Add2 = x => x + 2;

以前,我会讨厌改变我的代码的想法,只是为了让测试成为可能/更容易。直到我了解到这是硬件设计中的一个重要实践;他们为他们设计的硬件添加了某些连接点,这样他们就可以测试它是否正常工作。他们改变他们的设计以便于测试

是的,你完全可以通过重新布线这样做。在我看来,你用这些工具引入的额外复杂性(以及它,心理开销)不值得获得更多正确的"代码。

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

答案 2 :(得分:-2)

开玩笑是不可能的。此外,您不应该测试模块的内部,而只测试公共API,因为这是其他模块使用的。只要Add2返回yourModule([1,2,3]),他们就不会关心[3,4,5]的实施方式。