Я получил приложение React, используя Redux, Flow-typed и Jest. Для создания моих редукторов я использую собственную универсальную фабрику createReducer<S> (initialState: S, actions: any): Reducer<S>
Чтобы создать какой-то редуктор, я делаю:
const FooReducer = createReducer<FooState>(initialState, {
'ACTION_ADD_USER': () => 'Foo',
})
У меня есть следующий контрольный пример:
// @flow
import { createReducer } from 'create-reducer'
type AppState = { name: string }
const initialState: AppState = { name: '' }
const NameReducer = createReducer<AppState>(initialState, {
'NAME_CHANGE': (state, name) => ({ ...state, name })
})
it('should change the name', () => {
const action = { type: 'NAME_CHANGE', name: 'bar' }
expect(NameReducer({ name: 'foo' }, action)).toEqual({ name: 'bar' })
})
Шут выбрасывает следующую ошибку:
FAIL temp.spec.jsx
● Test suite failed to run
ReferenceError: AppState is not defined
7 | const initialState: AppState = { name: '' }
8 |
> 9 | const NameReducer = createReducer<AppState>(initialState, {
| ^
10 | 'NAME_CHANGE': (state, name) => ({ ...state, name })
11 | })
12 |
at Object.AppState (temp.spec.jsx:9:35)
По какой-то причине Jest не может найти определение моего типа, даже если оно объявлено прямо там. Я тщательно искал обходной путь, но пока мне не повезло. Надеюсь, у кого-то есть идея, что здесь не так?
ПРИЛОЖЕНИЕ:
Окружающая среда
babel-core 6.26.0
babel-jest 23.6.0
babel-loader 6.4.1
babel-preset-flow 6.23.0
flow-bin 0.89.0
flow-typed 2.2.0
jest 23.6.0
.babelrc (обновлено):
{
"plugins": [
"syntax-dynamic-import",
"transform-runtime",
"transform-object-rest-spread",
"transform-class-properties",
"transform-es2015-destructuring"
],
"presets": [
"babel-preset-flow",
"es2015",
"react",
"stage-0"
],
"env": {
"start": {
"presets": [
"react-hmre"
]
},
"test": {
"presets": [
"es2015",
"react",
"stage-0"
]
}
}
}
jest.config.js
module.exports = {
roots: ['<rootDir>/spec/javascripts'],
moduleNameMapper: {
'c3': '<rootDir>/__mocks__/c3.js',
'\\.(css|less|sass|scss)$': '<rootDir>/spec/javascripts/__mocks__/styleMock.js',
'\\.(gif|ttf|eot|svg)$': '<rootDir>/spec/javascripts/__mocks__/fileMock.js'
},
moduleFileExtensions: [
'jsx',
'js'
],
setupFiles: [
'<rootDir>/spec/javascripts/__mocks__/global-mocks.js'
],
moduleDirectories: [
'node_modules',
'app/javascript/src'
],
transform: {
'^.+\\.jsx?$': './node_modules/babel-jest'
},
testURL: 'http://localhost',
testRegex: '.*.spec.jsx',
verbose: true
}
createReducer.js
function createReducer<S> (initialState: S, handlers: any): Reducer<S> {
return function reducer (state = initialState, action) {
if (handlers.hasOwnProperty(action.type)) {
return handlers[action.type](state, action)
} else {
return state
}
}
}