Javascript 如何对未导出的函数进行单元测试?

Javascript 如何对未导出的函数进行单元测试?,javascript,ecmascript-6,jestjs,es6-modules,Javascript,Ecmascript 6,Jestjs,Es6 Modules,在JavaScriptES6模块中,可能有许多小而易于测试的函数需要测试,但不应该导出。如何在模块中测试函数而不导出它们?(不使用)。导出“可测试”常量 函数不应导出fn(){ //有需要测试的东西吗 //但不适用于本包装之外的用途 } 导出函数exportedFn(){ //应该被调用的函数 //来自此包之外的代码,以及 //使用此包中的其他函数 return不应导出fn(); } 导出常量可测试项={ shouldtbeexportedfn:shouldtbeexportedfn } 现在

在JavaScriptES6模块中,可能有许多小而易于测试的函数需要测试,但不应该导出。如何在模块中测试函数而不导出它们?(不使用)。

导出“可测试”常量
函数不应导出fn(){
//有需要测试的东西吗
//但不适用于本包装之外的用途
}
导出函数exportedFn(){
//应该被调用的函数
//来自此包之外的代码,以及
//使用此包中的其他函数
return不应导出fn();
}
导出常量可测试项={
shouldtbeexportedfn:shouldtbeexportedfn
}
现在

从“/myPackage”导入{exportedFn};
可用于生产代码和

从“/myPackage”导入{exportedFn,testables};
const{shouldtbeexportedfn}=可测试性;
可以在单元测试中使用

通过这种方式,它为我的团队中的其他开发人员保留了上下文线索,即除了测试之外,
不应在包外使用


我已经使用这个模式将近一年了,我发现它非常有效。

乔丹,我希望我能给你一个更好的答案。如果它们没有出口,那就意味着它们不是公共的,对吗?我假设在这种情况下,它们正被公开导出的函数/类/任何东西使用,因此您可以通过公开可用的内容来测试它们。@AlexSzabó是的,但我正在寻找一种直接测试它们的方法。使用它们的公共函数(在我的例子中)是一个复杂的生成器函数,因此很难通过公共函数测试它们。首先,很抱歉,我无法以任何有意义的方式帮助您:(-但是仅仅为了测试而公开私有函数并不被认为是一种好的做法。如果函数足够通用,您可以通过显式单元测试公开它们,但是如果它们不是,那么您将使您的测试与实现细节高度耦合,因此它们可能会中断(例如)关于重构而不改变行为。@AlexSzabó是的,我完全同意你的观点。谢谢你的投入!这可能只是我遇到的一个问题,因为我在这个项目中不得不使用特别复杂的工具。我也需要找到一种方法来做这件事。测试私有方法的功能使用公共方法不是一个非常有意义的单元测试。这种公共方法可能调用大量的私有方法,当它失败时,你将不知道在哪里或者为什么。我同意“私有函数是一个实现细节”需要测试的不是它们,而是您公开可用的函数、类或您手头的任何东西的行为。正如您所说,当您进行TDD时,您有一个单元打算在其他地方使用,并且您不断添加测试来描述它在特定条件下应该做什么-因此测试它的行为,不是内部的。@AlexSzabó我建议你看我放了一个链接的Mark Seeman的视频。他解释说,通过TDD测试,“内部”可能完全没问题。多年来,我越来越多地发现“内部”和“接口”在单元测试的上下文中是非常相关的。你不能在表达它时不拼错“答案”吗?您的意思一点也不清楚。恐怕这是唯一的答案。反射类会很方便。它允许您导入模块定义文件并访问未导出的字段。这是一个实用的想法,但无论如何它都在导出。如果有条件地导出,如使用
process.env.NOD,可能会更好E_ENV==='test'
@Kennyhyun,有趣的想法!随着webpack的DefinePlugin和UglifyJS删除
if('test'=='test'){
我认为这可能会起作用-它只需要输出就可以了,因为它具有顶级的导出。