我如何测试一个纯函数不开玩笑地从其他来源导出

How can I test a pure function does not exports from the other source with jest

 // add.js
 const add = (a, b) => a +b;

如何测试添加功能?我想测试添加功能逻辑。但我不知道如何测试它。因为函数没有导出。我希望仅在 add.js.

上调用此函数

我是否必须导出此添加函数才能使用 jest 进行测试?

关于这个话题有很多争论。如果您的 add 函数未导出,则它被认为是“private/internal”到您的模块,而不是 public API 的一部分。许多人争辩说你应该只测试你的 public API,其他人争辩说如果你想测试它们,你将需要导出你的私有函数。双方都提出了很好的观点,归结为偏好问题。

我的首选技术是将这些类型的辅助函数放在一个单独的模块中,单独测试并在您需要的任何地方导入。这些方法变成了“public”,但在实践中我发现它不会造成任何伤害,您实际上可能最终会在其他地方重用代码而无需重构任何东西。

您也可以尝试导出您的方法,但使用流行的 JSDoc 语法将它们标记为 @private。这只是对开发人员的 提示 他们不应导入或使用该方法,有些 editors/IDEs 甚至可能隐藏该方法来自智能感知。

/** @private */
export const add = (a, b) => a + b;

归根结底,如果不使用 rewire 之类的工具,您将无法真正测试私有 (non-exported) 方法。我以前经常使用 rewire,但是,我不再推荐它,因为它会使您的测试更加复杂和脆弱。我发现好的测试是简单易读的,当你使用 rewire 之类的东西时就不是这样了。不要陷入“开发人员不应该能够看到或使用此私有函数”的陷阱 - 在我看来,这是一种有毒的思考代码的方式。