У меня есть реактивный проект, который использует redux и connect (response-redux), и я хочу написать, что мои компоненты при подключении вызывают правильные действия.
Дело в том, что я не следовалтрадиционная структура с избыточностью, поэтому вместо использования mapDispatchToProps я экспортировал экземпляр своего магазина и забрал отправку непосредственно из него.
Мой магазин:
declare const window: any;
import { default as auth } from './reducer/auth.reducer';
import { default as request } from './reducer/request.reducer';
const appReducer = combineReducers({
auth,
request
});
const initialState = {};
const complexCompose = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : compose;
const enhancer = complexCompose(applyMiddleware(thunk), autoRehydrate());
const store = createStore(appReducer, initialState, enhancer);
// To purge the store
// persistStore(store, { storage: AsyncStorage }).purge();
persistStore(store, { storage: AsyncStorage as any, blacklist: [] });
export const dispatch = store.dispatch;
export const getState = store.getState;
export default store;
Один пример моих действий:
import { ActionPhase } from '../model/Enums';
import { ActionType } from '../model/ActionType';
import api from './api';
import store, { dispatch } from '../store';
import uuid from 'uuid';
export type AuthReduxAction =
| { type: ActionType.LOGIN, phase: ActionPhase, transactionId: string, payload ?: { user: any; token: any; }; };
export function login(email: string, password: string) {
const transactionId = uuid();
dispatch({ type: ActionType.LOGIN, phase: ActionPhase.START, transactionId });
return api.login(email, password)
.then((res) => {
store.dispatch({ type: ActionType.LOGIN, phase: ActionPhase.SUCCESS, transactionId });
return res;
})
.catch((err) => {
store.dispatch({ type: ActionType.LOGIN, phase: ActionPhase.FAIL, transactionId });
});
}
Мой тест:
import React from 'react';
import configureStore from 'redux-mock-store';
import { LoginContainer } from '../../src/container';
import { shallow } from 'enzyme';
describe('Test Login Container', () => {
const store = mockStore(initialState);
// jest.doMock('../../src/store', () => ({
// dispatch: store.dispatch
// }), { virtual: true });
// globalStore.dispatch = store.dispatch; <-- the thing that doesn't work
it('Mount', () => {
const wrapper = shallow(<LoginContainer navigation={navigation}/>,
{
context: { store }
}
);
expect(wrapper.dive()).toMatchSnapshot();
expect(store.getActions()).toMatchSnapshot(); // <- this is empty
});
});
Проблема заключается в следующем: когда я проверяю действия, отправленные в хранилище, на снимке, он пуст, в то время как я ожидаю увидеть отправленное действие входа в систему, любоепредложения?