Javascript 使用Jest获取内部函数

Javascript 使用Jest获取内部函数,javascript,unit-testing,jestjs,Javascript,Unit Testing,Jestjs,我只是在看笑话,因为它得到了很多好的报道。然而,我们仍在努力寻找一种访问内部函数的好方法来测试它们 因此,如果我有: const Add2 = (n)=> n+2; export default (list)=>{ return list.map(Add2()); } 如果我使用的是茉莉花或摩卡,我会使用rewire或babel插件rewire来获得内部Add2函数,如下所示: var rewire = require('rewire'); var Add2 = rewire

我只是在看笑话,因为它得到了很多好的报道。然而,我们仍在努力寻找一种访问内部函数的好方法来测试它们

因此,如果我有:

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

export default (list)=>{
  return list.map(Add2());
}
如果我使用的是茉莉花或摩卡,我会使用rewire或babel插件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);
});
{
  "plugin": ["rewire"]
}
然而,它们似乎都不适用于jest,虽然有一个优秀的模拟语法,但我看不到任何获得内部函数的方法


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

这在jest中是不可能的。另外,您不应该测试模块的内部,而应该只测试公共API,因为这是其他模块所使用的。只要
您的模块([1,2,3])
返回
[3,4,5]
,如果您愿意在每次测试之前使用babel转换文件,他们就不在乎如何实现
Add2
。以下是您需要做的(我假设您知道如何启动和运行babel本身,如果没有多个教程的话):

首先,我们需要为jest和babel安装:

npm install --save-dev babel-jest babel-plugin-rewire
然后,您需要将
.babelrc
文件添加到根目录中。它应该是这样的:

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

it('Should add 2 to number', ()=>{
  let val = Add2(1);
  expect(val).toEqual(3);
});
{
  "plugin": ["rewire"]
}
这应该是它(假设你有巴贝尔设置正确)。babel jest将自动选择
.babelrc
,因此不需要额外的配置,除非您已经准备好了其他转换。
Babel将在jest运行之前转换所有文件,speedskater的rewire插件将负责通过rewire API公开模块的内部内容。

我已经为这个问题挣扎了一段时间,我不认为这个问题是jest特有的

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

export const Add2 = x => x + 2;
以前,我讨厌改变我的代码,只是为了让测试变得可能/更容易。直到我了解到这是硬件设计中的一个重要实践;他们在正在设计的硬件中添加了某些连接点,以便测试其是否正常工作。他们正在改变设计以便于测试

是的,你完全可以用像重新布线这样的方法来完成。在我看来,这些工具带来的额外复杂性(以及由此带来的心理开销)不值得拥有“更正确”的代码


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

我确实了解测试内部函数,但我个人认为使用稳定的代码库来测试一些内部函数更好。我想这篇博文总结了我的感受-。有趣的是,你没有这些选项,可能需要考虑JEST是否适合我。不导出的模块内的函数不能从外部到达,没有一堆黑客。这也意味着你不再测试你的实际模块了。所以,如果你有一些非常重要的方法,把它们放到utils模块中,并在那里进行测试。嗯,我确实尝试过实现它,但效果并不好——这就是我使用Jasmine的方法。我做了一些研究,发现了这个-。你的设置是否正常,我是否遗漏了什么?是的,我们的设置正常。很难说你错过了什么。如果我在某处找到时间,我会尝试设置一个示例项目,但没有承诺。如果你能做同样的事情来说明失败的地方,也许我们可以一起找出问题所在?好的,干杯好的,我来看看我是否遗漏了什么,如果你得到了一个非常好的示例项目,你能在这里帮我吗?谢谢