Javascript 测试rootReducer中是否已导入所有还原剂
我有一个rootReducer,它导入所有单独的reducer,如下所示:Javascript 测试rootReducer中是否已导入所有还原剂,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,我有一个rootReducer,它导入所有单独的reducer,如下所示: import { combineReducers } from 'redux'; import departments from './departments'; import indicators from './indicators'; import versions from './versions'; import projects from './projects'; // combine all reduc
import { combineReducers } from 'redux';
import departments from './departments';
import indicators from './indicators';
import versions from './versions';
import projects from './projects';
// combine all reducers to a single reducer, state will be linked to a reducer via the key used here
const rootReducer = combineReducers({
versions,
departments,
indicators,
projects,
});
export default rootReducer;
由于导入所有内容对这个减速机很重要,我认为测试/src/reducers
中定义的所有减速机是否都已导入是有意义的。我能想到的唯一方法是使用fs
来检查/src/reducers
(没有索引
,或者rootReducer
)中的文件数,并检查rootReducer
是否包含那么多的reducer
看起来是一个丑陋的测试,也有点脆弱。但是,当您忘记包含减速器时,如果收到测试失败的通知,那将是非常好的。测试是否所有还原剂都已进口的最佳方法是什么?您建议的方法可能有效,但我同意,类似的方法很脆弱,甚至可能无法测试您关心的行为 退一步,看看您发布的代码的行为。如果你把它抽象成英语,它可能看起来像这样:
combineReducers的函数
combinereducer
,并传递一个对象,该对象包含我希望包含的每个reducercombinereducer
是否使用您期望的参数调用,为什么不存根此函数并断言该行为
您可以使用SinonJS来combinereducer
,并且在require()
您的根减速机之后,您可以断言combinereducer
被调用了一次,并且它是用包含您期望的键和值的对象调用的。我可以这样做(使用mocha
测试框架和chai
进行断言):
与您建议的方法相比,这种方法的优点是它不依赖于文件夹中存在的任意数量的文件,如果您想添加新减速器或移除旧减速器,那么在测试中保持预期值的变量就是所有需要修改的变量。我听说您来自何方,但我认为您不想在测试中处理此问题。随着应用程序的增长,您可能需要一个更深的减速器树。例如,您的
项目
减速器可能由多个子减速器组成,您必须管理需要从何处导入的减速器。文件系统测试将变得越来越脆弱。通常,导入和文件结构是项目的实现细节,您希望测试项目的行为
但是想要立即得到关于没有连接减速器的反馈是完全有道理的。我会尝试在构建级别处理它。假设你正在使用Webpack,看看是否可以解决你的问题。它检测未使用的导出。将它添加到您的插件中
new UnusedFilesWebpackPlugin({ pattern: 'src/reducers/**' })
当您有一个未导入的文件时,您的构建将向您发出警告。由于它与模块一起工作,因此您不必担心目录结构(除了确保模式与您要检查的所有文件匹配之外)。同意测试文件系统将是脆弱的。但是如果一个开发人员添加了一个reducer,但是忘记了将它添加到根reducer中,那么他们肯定也忘记了更新这个规范,对吧?当然,但是如果一个开发人员意外地删除了一个,这会抓住它。添加另一个reducer并同时更新此测试是一个非常简单的过程。实际上,删除reducer将被此测试捕获。但我认为最常见的情况是忘记添加一个。我认为我想要测试它的目标并不是最终属于我的单元测试。正如@MichaelParker所建议的那样,在构建过程中,它会更自在。谢谢你的回答!啊,这是一个很好的解决方案!我认为你在实现和行为之间的区别很有意义。更容易对测试的具体内容进行推理。谢谢
new UnusedFilesWebpackPlugin({ pattern: 'src/reducers/**' })