reactjs - Funktionel test med TypeScript af butiksændring med asynkron redux-thunk-handling
Jeg har oprettet funktionelle tests i React med TypeScript for at teste korrekt opførsel af store efter asynkron handling med at hente post.
Jeg havde oprettet et separat hjælpeprogram med fil til test af butikken:
export const testStore = (initialState: State={posts: []}) => {
const createStoreWithMiddleware = applyMiddleware(...middlewares)(createStore)
return createStoreWithMiddleware(rootReducer, initialState);
}
Så skrev jeg testimplementeringen som nedenfor:
import {fetchPosts} from '../actions'
import axios, {AxiosResponse} from "axios";
import configureStore from 'redux-mock-store'
jest.mock('axios')
const mockedAxios = axios as jest.Mocked<typeof axios>;
import expectedPosts from "../__mocks__/expectedPosts";
import State from "../state";
import reduxThunk, { ThunkDispatch } from "redux-thunk";
import Action from "../actions/types";
import {testStore} from "../Utils";
type DispatchExts = ThunkDispatch<State, void, Action>
const middlewares = [reduxThunk];
const mockStore = configureStore<State, DispatchExts>(middlewares);
describe('fetchPosts action', () => {
it('Store is updated correctly', async () => {
const mockedResponse: AxiosResponse = {
data: expectedPosts,
status: 200,
statusText: 'OK',
headers: {},
config: {}
}
mockedAxios.get.mockResolvedValueOnce(mockedResponse);
const store = testStore({posts: []});
await store.dispatch(fetchPosts());
const newState = store.getState();
expect(newState.posts).toEqual(mockedResponse.data);
expect(newState.posts).not.toBe(mockedResponse.data);
});
});
Alt ser ud til at være i orden med undtagelse af linjen: await store.dispatch(fetchPosts());
Der er en TypeScript-fejl: TS2345: Argumentet af typen 'ThunkAction' kan ikke tildeles parameteren af typen 'Action'. Typen 'ThunkAction' mangler følgende egenskaber fra typen 'ActionGetUser': type, payload
Link til repository med projekt: https://github.com/pirx1988/react-store-testing/tree/develop
Sti til fil med test: /src/integrationTests/index.test.ts
Hvordan kan jeg håndtere det? Jeg har oprettet en butik med middleware redux-thunk, men dispatch kan ikke forstå async thunk fetchPosts handling her og forventer en handling med almindeligt objekt.
Svar #1
Du kan rette det ved at bruge :
await (store.dispatch as ThunkDispatch<State, unknown, Actions>)(fetchPosts());
