加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactjs – Redux警告仅出现在测试中

发布时间:2020-12-15 20:47:08 所属栏目:百科 来源:网络整理
导读:我用react redux创造了一个tic tac toe游戏. 我正在使用create-react-app. 我有以下商店: import {createStore,combineReducers} from 'redux';import gameSettingsReducer from './reducers/gameSettings.js';import gameStatusReducer from './reducers/g
我用react redux创造了一个tic tac toe游戏.

我正在使用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_modulesreduxlibutilswarning.js:14
  No reducer provided for key "gameStatus"
console.error node_modulesreduxlibutilswarning.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似乎并非易事.

祝好运!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读