我正在使用create-react-app.
我有以下商店:
import {createStore,combineReducers} from 'redux'; import gameSettingsReducer from './reducers/gameSettings.js'; import gameStatusReducer from './reducers/gameStatus.js'; const rootReducer = combineReducers({gameSettings: gameSettingsReducer,gameStatus: gameStatusReducer}); export const defaultGameStatus = { currentPlayerSymbol: "X",turnNumber: 0,currentView: "start-menu",//one of "start-menu","in-game","game-over" winner: "draw",//one of "X","O","draw" board: [["E","E","E"],["E","E"]],lastMove: [] }; const store = createStore(rootReducer,{ gameSettings:{ playerSymbol: "X","O" difficulty: "easy" //one of "easy","hard" },gameStatus: defaultGameStatus }); export default store;
一切都按照我的预期运行.除了我运行测试(npm test)时,控制台中会出现以下内容:
console.error node_modules\redux\lib\utils\warning.js:14 No reducer provided for key "gameStatus" console.error node_modules\redux\lib\utils\warning.js:14 Unexpected key "gameStatus" found in preloadedState argument passed to createStore. Expected to find one of the known reducer keys instead: "gameSettings". Unexpected keys will be ignored.
在我的几个测试中,我甚至没有测试商店.所以我想在编译代码时会出现这种情况.
我尝试在根减速器行之前放置console.log(gameStatusReducer).
它表明gameStatusReducer未定义.
由于gameSettingsReducer和gameStatusReducer都以非常相似的方式创建,我不知道这个错误来自哪里,甚至不知道如何进一步调查这个问题.这仅在运行测试时显示.运行应用程序不会显示此问题,应用程序按预期工作.
所以,问题是:
>为什么这只是在测试中出现?
>如何调查问题的来源?
快速修复:为gameStateReducer而不是默认值进行正常导出,并使用import {gameStateReducer}从//导入到其他地方….
Jest会自动模拟一些导入,显然它在这种情况下有问题,或者它期望某种配置,即react-create-app没有提供.
至于为什么Jest甚至记录了这个错误(考虑到相关代码没有在任何测试中导入),我认为这是由于它的内部工作原理.
支持这一点有以下证据:向npm测试脚本添加–testPathPattern标志仅匹配以.test.js结尾的文件不会改变行为,但仍会出现错误.
如何调查问题:我首先弄清楚导致错误日志的代码是否在测试中(间接可能是,例如导入).在排除这一点后,我开始模拟传递给combineReducers的函数,以确保任何更改都会影响错误日志的结果,并且他们确实如此.只需添加:
gameStatus: gameStatusReducer || (() => ())
…已经解决了这个问题,这意味着导入错误是什么,以及Jest / babel-jest如何处理它.
如果我要进一步研究这个问题,我会用Jest创建自己的安装并提供我自己的配置,看看Jest是否仍然编译整个应用程序.如果您使用react-create-app,将配置选项传递给Jest似乎并非易事.
祝好运!