使用 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" 代码。
这是一个权衡,我重视测试和简单性,所以对我来说,导出私有函数用于测试目的是可以的。
我正在重新审视 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" 代码。
这是一个权衡,我重视测试和简单性,所以对我来说,导出私有函数用于测试目的是可以的。