在 React-Redux 应用程序中使用 JEST 进行测试时导入问题

Posted

技术标签:

【中文标题】在 React-Redux 应用程序中使用 JEST 进行测试时导入问题【英文标题】:Problems with import on testing with JEST in React-Redux app 【发布时间】:2019-06-12 13:01:58 【问题描述】:

我有一些问题。

在我的 React-Redux 中,我尝试使用操作函数测试一些文件。 其中一个功能是异步

这是这个文件的代码

import client from 'apollo/'
import  ME  from 'apollo/queries'

export const ActionTypes = 
  REQUEST_PROFILE: '@@profile/REQUEST_PROFILE',
  REQUEST_PROFILE_CANCELED: '@@profile/REQUEST_PROFILE_CANCELED',
  ERROR_REQUEST_PROFILE: '@@profile/ERROR_REQUEST_PROFILE',
 

export const requestProfile = () => (dispatch) => 
  dispatch( type: ActionTypes.REQUEST_PROFILE )
  client.query(
    query: ME,
    fetchPolicy: 'network-only'
  ).then(resp => 
    const profile = resp.data.me
    dispatch(setUser(profile))
  ).catch(err => 
    console.log(...err)
    dispatch( type: ActionTypes.ERROR_REQUEST_PROFILE, err )
  )

import client from 'apollo/' 是一个 Apollo 客户端实例

这个文件的代码也很简单

import ApolloClient from 'apollo-client'
import  setContext  from 'apollo-link-context'
import  createHttpLink  from 'apollo-link-http'
import  InMemoryCache  from 'apollo-cache-inmemory'
import  onError  from 'apollo-link-error'
import  from  from 'apollo-link'
import  store from '../redux/'
import  setErrorStatus  from 'actions/Base'
import  logOut, getToken  from 'helpers/localStorage'

const errorCodes = onError(( networkError ) => 
  if (!networkError) 
    return false
  
  let status = networkError.statusCode
  if (status === 400) 
    return false
   if (status === 401) 
    logOut()
    return false
  
  store.dispatch(setErrorStatus(status))
)

const cache = new InMemoryCache()
const authLink = setContext((_,  headers ) => 
  const token = getToken()
  return 
    headers: 
      ...headers,
      authorization: token ? `JWT $token` : "",
    
  
)

const httpLink = createHttpLink(
  uri: `https://api.url.com/`,
)

export default new ApolloClient(
  link: from([errorCodes, authLink, httpLink]),
  cache
)

import store from '../redux/'这里我导入了store,在这个文件中导入了reducer。

import  combineReducers  from 'redux'
import Profile from './Profile'


export default combineReducers(
    Profile
)

import Profile from './Profile'

import  ActionTypes  from 'actions/Profile'


export default (state = initialState, action) => 
  switch (action.type) 
    case ActionTypes.REQUEST_PROFILE:
    default:
      return state
  

项目工作,启动项目没有问题。在生产环境和浏览器中也没有错误。

但是当我尝试测试我的actions/Profile.js 时,出现了一些奇怪的错误。

这是测试代码

import 
  requestProfile, ActionTypes
 from './Profile'

describe('Profile actions', () => 
  it('requestProfile', () => 

  )
)

还有错误

  ● Test suite failed to run

    TypeError: Cannot read property 'REQUEST_PROFILE' of undefined

      16 | export default (state = initialState, action) => 
      17 |   switch (action.type) 
    > 18 |     case ActionTypes.REQUEST_PROFILE:
         |                               ^
      19 |       return state

      at Object.<anonymous>.exports.default (src/redux/reducers/Profile.js:18:31)
      at node_modules/redux/lib/combineReducers.js:53:24
          at Array.forEach (<anonymous>)
      at assertReducerShape (node_modules/redux/lib/combineReducers.js:51:25)
      at combineReducers (node_modules/redux/lib/combineReducers.js:107:5)
      at Object.<anonymous> (src/redux/reducers/index.js:12:45)
      at Object.<anonymous> (src/redux/index.js:1:163)
      at Object.<anonymous> (src/apollo-client/index.js:7:14)
      at Object.<anonymous> (src/redux/actions/Profile.js:1:174)
      at Object.<anonymous> (src/redux/actions/Profile.test.js:1:56)```

I cannot understand the core of this error. I am sure, that ActionType is here and it`s value not undefined. And `moduleNameMapper` is setup correctly. Any one can help me with this promlem? 

【问题讨论】:

问题出在导入文件上,我测试了我已经测试actions/Profile 并且在嵌套导入中这个文件也被导入了 那是抛出错误 【参考方案1】:

import ActionTypes from 'actions/Profile'这是正确的导入吗?

基于您提供的其余代码。不应该导入:

import ActionTypes from './Profile';

【讨论】:

以上是关于在 React-Redux 应用程序中使用 JEST 进行测试时导入问题的主要内容,如果未能解决你的问题,请参考以下文章

在 React-Redux 应用程序中使用 JEST 进行测试时导入问题

Java Enterprise Server与Glassfish

在 react-redux 应用程序中使用默认错误处理管理 API 调用

使用通过 react、redux 和 react-redux 完成的组件以及在 react 应用程序中使用 webpack 构建时出错

zosftplib submit_wait_job(jcl) 函数不接收 JES 输出

如何使用 react-redux 存储令牌并在多个 axios 请求中使用它?