2017-04-12 124 views
4

我已经创建了一个tic tac toe游戏,带有reactx。我正在使用create-react-appRedux警告只出现在测试中

我有以下的店铺:

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", "E"], 
       ["E", "E", "E"]], 
     lastMove: [] 
}; 

const store = createStore(rootReducer, { 
    gameSettings:{ 
     playerSymbol: "X", //one of "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都是以非常相似的方式创建的,我不知道这个错误来自哪里,甚至不知道如何进一步调查问题。这只在运行测试时才显示出来。运行应用程序不会显示此问题,并且应用程序按预期工作。

所以,问题是:

  • 为什么这只是显示在测试吗?
  • 如何调查问题来自哪里?
+0

向我们展示./reducers/gameStatus.js的代码,这可能是一个问题。 – Yuval

+0

不知道我是否应该把所有这些代码放在这个问题中:https://github.com/zelite/tic-tac-toe/blob/master/src/reducers/gameStatus.js就像我说的,错误只出现在测试中。在浏览器中正常运行应用程序时,减速器正常工作。 – zelite

+0

它给你什么问题?那是'tree.test.js'还是'board.test.js'? –

回答

7

经过很多撞击我的头对着键盘,我发现了一些线索。

快速修复:进行正常exportgameStateReducer代替default,并与其他地方import { gameStateReducer } from // ...导入。

Jest会自动模拟某些进口,显然它在这种情况下很麻烦,或者它期望react-create-app未提供某种配置。

至于为什么Jest甚至记录错误(考虑到相关代码没有在任何测试中导入),我想这是由于它的内部工作原因。

支持,这是下列证据:添加--testPathPattern标志的npm test脚本只匹配在.test.js结束,并且没有改变行为,仍出现错误文件。

如何调查问题:我开始找出导致错误日志中的代码是否在测试或没有(间接也有可能是,与import为例)。在判定了这一点后,我开始嘲笑传递给combineReducers的函数,以确保任何更改都影响错误日志的结果,并且他们做到了。简单地增加这样的:

gameStatus: gameStatusReducer || (() =>()) 

...已经解决了这个问题,这意味着什么是错的是import和玩笑/ babel-jest如何处理它。

如果我要进一步调查此问题,我将使用Jest创建自己的安装并提供自己的配置,以查看Jest是否仍编译整个应用程序。如果您使用react-create-app,将配置选项传递给Jest似乎并非微不足道。

祝你好运!

-2

结合reducer,当然import { combineReducers } from 'redux';而不是合并它们到一个对象,并把它给予createStore。

例:

const appReducer = combineReducers({ 
     gameSettings: ..., 
     gameStatus: ..., 
    }); 

    const store = createStore(
    appReducer, 
    enhancer, 
); 
2

也有过这样的错误,但使用打字稿。

为了论证,我们假设我们的错误是No reducer provided for key "favourites"

对于导致此错误的测试,我们从该reducer的文件导入了一个接口,该接口显然运行该文件以生成导出。

我们的favourites reducer导入我们的Redux存储来查询状态的另一个位作为其开关情况的一部分。

出于某种原因,注释掉我们访问Store.getState().someOtherReducersState的行使错误消失。

所以解决的办法是简单地在测试文件jest.mock('../route/to/Store');导致错误输出。