Javascript 使用Jest运行时,被调用函数具有未定义的参数
有人遇到过同样的问题吗? 我正在用babeljest运行jest,并在jest.config.js中配置了正确的网页别名 但是当我运行测试时,我看到了下一个行为 导入的历史对象在index.js中正确定义,并作为参数传递给configureStore{history}函数 但在函数内部,它变得未定义。使用调试器检查多次 我试图通过jest.disableAutomock甚至在jest.config.js中禁用所有mock,但什么也没发生。我仍然看到这种行为。很明显,稍后当代码试图执行history.location时,我得到了一个异常,因为它是未定义的Javascript 使用Jest运行时,被调用函数具有未定义的参数,javascript,reactjs,jestjs,Javascript,Reactjs,Jestjs,有人遇到过同样的问题吗? 我正在用babeljest运行jest,并在jest.config.js中配置了正确的网页别名 但是当我运行测试时,我看到了下一个行为 导入的历史对象在index.js中正确定义,并作为参数传递给configureStore{history}函数 但在函数内部,它变得未定义。使用调试器检查多次 我试图通过jest.disableAutomock甚至在jest.config.js中禁用所有mock,但什么也没发生。我仍然看到这种行为。很明显,稍后当代码试图执行histor
// For a detailed explanation regarding each configuration property, visit:
// https://jestjs.io/docs/en/configuration.html
module.exports = {
collectCoverage: false,
coverageDirectory: '<rootDir>/coverage',
verbose: true,
setupFiles: ['<rootDir>/__mocks__/setupJest.js'],
transform: {
'\\.(jpg|jpeg|png|gif|webp|svg|ttf|woff|woff2|)$': '<rootDir>/__mocks__/fileTransformer.js',
'^.+\\.js$': 'babel-jest'
},
globals: {
NODE_ENV: 'test',
APP_ENV: 'test',
GIT_VERSION: 1
},
coveragePathIgnorePatterns: [
'<rootDir>/node_modules'
],
modulePaths: ['<rootDir>/js'],
moduleFileExtensions: ['js', 'css'],
moduleDirectories: ['node_modules'],
modulePathIgnorePatterns: ['<rootDir>/public'],
moduleNameMapper: {
'^.+\\.css$': 'identity-obj-proxy',
'^common-styles(.*)$': '<rootDir>/public/styles$1',
'^styles(.*)$': '<rootDir>/js/styles$1',
'^reducers(.*)$': '<rootDir>/js/reducers$1',
'^store(.*)$': '<rootDir>/js/store$1',
'^middlewares(.*)$': '<rootDir>/js/middlewares$1',
'^newComponents(.*)$': '<rootDir>/js/newComponents$1',
'^components(.*)$': '<rootDir>/js/components$1',
'^containers(.*)$': '<rootDir>/js/containers$1',
'^layouts(.*)$': '<rootDir>/js/layouts$1',
'^routes(.*)$': '<rootDir>/js/routes$1',
'^pages(.*)$': '<rootDir>/js/pages$1',
'^sagas(.*)$': '<rootDir>/js/sagas$1',
'^services(.*)$': '<rootDir>/js/services$1',
'^utils(.*)$8': '<rootDir>/js/utils$1',
'^hocs(.*)$': '<rootDir>/js/hocs$1',
'^hooks(.*)$': '<rootDir>/js/hooks$1',
'^locales(.*)$': '<rootDir>/js/locales$1',
'^api(.*)$': '<rootDir>/js/api$1',
'^schemas(.*)$': '<rootDir>/js/utils/schemas$1',
'^constants(.*)$': '<rootDir>/js/constants$1',
'^src/featureToggles$': '<rootDir>/js/featureToggles.json',
'^src$': '<rootDir>/js',
'^src/(.*)$': '<rootDir>/js/$1'
},
transformIgnorePatterns: ['<rootDir>/node_modules/']
}
测试本身
import { alphabeticalSortWithProp } from 'routes/CustomerContent/helpers'
test('sorts objects by property desc', () => {
const entries = [{ name: 'A' }, { name: 'B' }, { name: 'C' }]
const expected = [{ name: 'C' }, { name: 'B' }, { name: 'A' }]
const result = alphabeticalSortWithProp('name', 'desc')(entries)
expect(expected).toEqual(result)
})
测试文件
import { ROOT_FOLDER_ID } from 'constants/common'
import * as R from 'ramda'
import { history } from 'utils/history'
export const alphabeticalSortWithProp = (propName, type) =>
R.compose(
R.sort,
sortStrategy(type),
sortNormalization
)(propName)
历史文件
import { createBrowserHistory } from 'history'
import { globalDispatch } from 'src/index'
import { showRouteLeaveWarning } from 'utils/actions'
export const history = createBrowserHistory({
getUserConfirmation: (message, callback) => globalDispatch(showRouteLeaveWarning({
cancelHandler: () => callback(false),
submitHandler: () => callback(true)
}))
})
以及包含globalDispatch的index.js
import 'locales'
/* global GIT_VERSION */
import React from 'react'
import { render } from 'react-dom'
import { Provider } from 'react-redux'
import { ConnectedRouter } from 'connected-react-router'
import sagaMiddleware from 'middlewares/sagaMiddleware'
import rootSaga from 'sagas'
import configureStore from 'store/configureStore'
import { AppContainer } from 'react-hot-loader'
import { initializeAnalytycs } from 'utils/analytics/init'
import { history } from 'utils/history'
import GlobalStyles from 'utils/styles/global'
import * as Sentry from '@sentry/browser'
import { ERROR_SETTINGS } from 'utils/sentry'
import 'normalize.css'
import 'flexboxgrid/dist/flexboxgrid.css'
import 'react-select/dist/react-select.css'
import 'swiper/dist/css/swiper.min.css'
import 'common-styles/fonts.css'
import 'common-styles/tooltip.css'
import 'common-styles/safari.css'
import 'common-styles/slider.css'
import 'common-styles/react_slick_custom.css'
import 'rc-slider/assets/index.css'
import 'rc-tooltip/assets/bootstrap.css'
import 'react-datepicker/dist/react-datepicker.css'
import 'react-spinner/react-spinner.css'
import BootStrapApp from './BootStrapApp.js'
// initialize raven for reporting the uncaught exception to sentry for all the env except development
if (!['development', 'test'].includes(process.env.APP_ENV)) {
Sentry.init({
dsn: process.env.SENTRY_KEY,
environment: process.env.APP_ENV,
release: GIT_VERSION,
...ERROR_SETTINGS
})
}
const store =
window.Store ||
configureStore(
{
history
},
window.__initialState__
)
window.Store = store
export const globalDispatch = store.dispatch
sagaMiddleware.run(rootSaga)
initializeAnalytycs()
if (module.hot) module.hot.accept()
const renderApp = RootComponent => {
render(
<AppContainer>
<Provider store={store}>
<ConnectedRouter history={history}>
<RootComponent />
<GlobalStyles />
</ConnectedRouter>
</Provider>
</AppContainer>,
document.getElementById('app')
)
}
renderApp(BootStrapApp)
您能复制粘贴测试代码和测试代码吗。这将更容易看出way@litelite添加了可能影响测试的所有依赖项。因此,实际上,您可以在index.js中看到以下行const store=window.store | | configureStore{history},window.u initialState_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
import 'locales'
/* global GIT_VERSION */
import React from 'react'
import { render } from 'react-dom'
import { Provider } from 'react-redux'
import { ConnectedRouter } from 'connected-react-router'
import sagaMiddleware from 'middlewares/sagaMiddleware'
import rootSaga from 'sagas'
import configureStore from 'store/configureStore'
import { AppContainer } from 'react-hot-loader'
import { initializeAnalytycs } from 'utils/analytics/init'
import { history } from 'utils/history'
import GlobalStyles from 'utils/styles/global'
import * as Sentry from '@sentry/browser'
import { ERROR_SETTINGS } from 'utils/sentry'
import 'normalize.css'
import 'flexboxgrid/dist/flexboxgrid.css'
import 'react-select/dist/react-select.css'
import 'swiper/dist/css/swiper.min.css'
import 'common-styles/fonts.css'
import 'common-styles/tooltip.css'
import 'common-styles/safari.css'
import 'common-styles/slider.css'
import 'common-styles/react_slick_custom.css'
import 'rc-slider/assets/index.css'
import 'rc-tooltip/assets/bootstrap.css'
import 'react-datepicker/dist/react-datepicker.css'
import 'react-spinner/react-spinner.css'
import BootStrapApp from './BootStrapApp.js'
// initialize raven for reporting the uncaught exception to sentry for all the env except development
if (!['development', 'test'].includes(process.env.APP_ENV)) {
Sentry.init({
dsn: process.env.SENTRY_KEY,
environment: process.env.APP_ENV,
release: GIT_VERSION,
...ERROR_SETTINGS
})
}
const store =
window.Store ||
configureStore(
{
history
},
window.__initialState__
)
window.Store = store
export const globalDispatch = store.dispatch
sagaMiddleware.run(rootSaga)
initializeAnalytycs()
if (module.hot) module.hot.accept()
const renderApp = RootComponent => {
render(
<AppContainer>
<Provider store={store}>
<ConnectedRouter history={history}>
<RootComponent />
<GlobalStyles />
</ConnectedRouter>
</Provider>
</AppContainer>,
document.getElementById('app')
)
}
renderApp(BootStrapApp)