Javascript 测试rootReducer中是否已导入所有还原剂

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

我有一个rootReducer,它导入所有单独的reducer,如下所示:

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
    ,并传递一个对象,该对象包含我希望包含的每个reducer
  • 导出调用组合减速机的结果
  • 你似乎只关心#3,这取决于#1和#2是否正确。如果您想测试
    combinereducer
    是否使用您期望的参数调用,为什么不存根此函数并断言该行为

    您可以使用SinonJS来
    combinereducer
    ,并且在
    require()
    您的根减速机之后,您可以断言
    combinereducer
    被调用了一次,并且它是用包含您期望的键和值的对象调用的。我可以这样做(使用
    mocha
    测试框架和
    chai
    进行断言):


    与您建议的方法相比,这种方法的优点是它不依赖于文件夹中存在的任意数量的文件,如果您想添加新减速器或移除旧减速器,那么在测试中保持预期值的变量就是所有需要修改的变量。

    我听说您来自何方,但我认为您不想在测试中处理此问题。随着应用程序的增长,您可能需要一个更深的减速器树。例如,您的
    项目
    减速器可能由多个子减速器组成,您必须管理需要从何处导入的减速器。文件系统测试将变得越来越脆弱。通常,导入和文件结构是项目的实现细节,您希望测试项目的行为

    但是想要立即得到关于没有连接减速器的反馈是完全有道理的。我会尝试在构建级别处理它。假设你正在使用Webpack,看看是否可以解决你的问题。它检测未使用的导出。将它添加到您的插件中

    new UnusedFilesWebpackPlugin({ pattern: 'src/reducers/**' })
    

    当您有一个未导入的文件时,您的构建将向您发出警告。由于它与模块一起工作,因此您不必担心目录结构(除了确保模式与您要检查的所有文件匹配之外)。

    同意测试文件系统将是脆弱的。但是如果一个开发人员添加了一个reducer,但是忘记了将它添加到根reducer中,那么他们肯定也忘记了更新这个规范,对吧?当然,但是如果一个开发人员意外地删除了一个,这会抓住它。添加另一个reducer并同时更新此测试是一个非常简单的过程。实际上,删除reducer将被此测试捕获。但我认为最常见的情况是忘记添加一个。我认为我想要测试它的目标并不是最终属于我的单元测试。正如@MichaelParker所建议的那样,在构建过程中,它会更自在。谢谢你的回答!啊,这是一个很好的解决方案!我认为你在实现和行为之间的区别很有意义。更容易对测试的具体内容进行推理。谢谢
    new UnusedFilesWebpackPlugin({ pattern: 'src/reducers/**' })