【问题标题】:"No reducer provided for key X" console.error in redux jest test“没有为键 X 提供减速器”控制台。redux 笑话测试中的错误
【发布时间】:2017-11-22 18:49:18
【问题描述】:

我有一个减速器测试通过,但最后抛出了这个奇怪的错误:

console.error node_modules/redux/lib/utils/warning.js:14
    No reducer provided for key "newProducts"

src/reducer/index.ts

import newLineItemReducer from "./newLineItemReducer";
import renewedLineItemReducer from "./renewedLineItemReducer";

export interface LineItemState{
  renewedProducts: LineItem[]
  newProducts: LineItem[]
}

//used by both reducers
export interface LineItem{ 
  ...
}

// used by both "new" and "renewed" slice reducers
export function sharedFunction1() {
  ...
}

export default combineReducers<LineItemState>({
  renewedProducts: renewedLineItemReducer,
  newProducts: newLineItemReducer
});

src/reducer/newLineItemReducer.ts

import {LineItem, sharedFunction1 } from "./";

type Action = ...;
const newLineItemReducer =
  (state: LineItem[] = [], action: Action): LineItem[] => {
  switch (action.type) {
    case ...:
      sharedFunction1(state, action.foo);
  }
}
export default newLineItemReducer;

test/newLineItemReducer.spec.ts

import newLineItemReducer from "@src/reducers/newLineItemReducer";
test("foo", () => {
   let state = //
   let action = //
   const updatedState = newLineItemReducer(state, action);
   ...
});

奇怪的是,实际上并没有从 index.js 调用根 reducer 的代码。我的测试是直接调用切片“newLineItemReducer”。似乎只是从reducer/index.ts 导入共享接口和案例函数的行为导致了问题(如果我删除combineReducer 导出没有错误)?

【问题讨论】:

  • 我的猜测是当两个文件相互导入时,您遇到了循环导入的问题。 newLineItemReducer.ts 导入 index.ts 再次导入 newLineItemReducer.ts。根据模块加载器的不同,您可能会收到错误,或者在您的情况下,某些值在导入时将是未定义的。我建议将共享代码移到单独的文件中。
  • 是的...我有一种感觉,这可能是解决办法。对共享文件的命名约定有何建议?
  • 我不熟悉 TypeScript 和 TS 社区的最佳实践,但我会将接口移动到一个单独的文件中(可能每个文件一个接口,但请查看 TS 文档的建议)。我也不确定sharedFunction1的用途,所以我不知道如何为它调用文件。
  • @MichaelRadionov 仅供参考,确实修复了它;一定是 ts-jest (github.com/kulshekhar/ts-jest) 的问题。随时提交答案,我会接受。 sharedFunction1 将是 redux 文档所称的“案例函数”redux.js.org/docs/recipes/reducers/SplittingReducerLogic.html。我现在只用一些通用的东西。感谢您的帮助

标签: typescript redux jestjs


【解决方案1】:

我遇到了同样的问题,正如上面 cmets 部分中@michael-radionov 所提到的,这是一个循环导入,我使用circular-dependency-plugin 插件来跟踪这些循环导入,有关插件使用的更多信息可以在插件仓库或在下面article

【讨论】:

    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 2016-06-18
    • 2017-05-09
    • 2021-03-11
    • 2021-01-15
    • 2015-10-26
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多