View in Telegram
πŸš€ ВСстированиС Redux: Actions, Reducers ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ mock-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠŸΡ€ΠΈΠ²Π΅Ρ‚! БСгодня Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ actions, reducers ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹Π΅ ΠΊ Redux. Π­Ρ‚ΠΈ знания ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²Π°ΠΌ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ вашС состояниС ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ. πŸ”Ή ВСстированиС reducers Reducer β€” это чистая функция. Она ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС ΠΈ action, возвращая Π½ΠΎΠ²ΠΎΠ΅ состояниС. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° тСста 1. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС. 2. ΠŸΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π² reducer action ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
import { counterReducer } from './counterSlice';

describe('counterReducer', () => {
  it('Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅', () => {
    const initialState = { count: 0 };
    const action = { type: 'counter/increment' };

    const result = counterReducer(initialState, action);

    expect(result).toEqual({ count: 1 });
  });

  it('Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅', () => {
    const initialState = { count: 2 };
    const action = { type: 'counter/decrement' };

    const result = counterReducer(initialState, action);

    expect(result).toEqual({ count: 1 });
  });
});
ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π²Π°ΠΆΠ½ΠΎ? - Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ваш reducer Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ состояниС для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ action. - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° edge-кСйсов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ). πŸ”Ή ВСстированиС actions Actions сами ΠΏΠΎ сСбС Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСслоТно. Однако для thunk ΠΈΠ»ΠΈ асинхронных actions Π²Π°ΠΌ понадобятся ΠΌΠΎΠΊΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ВСстированиС синхронных actions
import { increment, decrement } from './counterSlice';

describe('actions', () => {
  it('increment Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ action', () => {
    expect(increment()).toEqual({ type: 'counter/increment' });
  });

  it('decrement Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ action', () => {
    expect(decrement()).toEqual({ type: 'counter/decrement' });
  });
});
ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ВСстированиС асинхронных actions (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ redux-thunk)
import configureMockStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import { fetchData } from './dataActions';
import { fetchDataSuccess } from './dataSlice';

const mockStore = configureMockStore([thunk]);

describe('async actions', () => {
  it('Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄ΠΈΡΠΏΠ°Ρ‚Ρ‡ΠΈΡ‚ΡŒ fetchDataSuccess послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ API-запроса', async () => {
    const store = mockStore({});
    const mockResponse = { data: 'test' };

    // МокаСм fetch
    global.fetch = jest.fn(() =>
      Promise.resolve({
        json: () => Promise.resolve(mockResponse),
      })
    );

    await store.dispatch(fetchData());

    const actions = store.getActions();
    expect(actions[0]).toEqual(fetchDataSuccess(mockResponse));
  });
});
πŸ”Ή ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ mock-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Для тСстирования ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Redux, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ mock-store ΠΈΠ»ΠΈ ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΡƒ Provider с тСстовым Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ВСстированиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° с Provider
import React from 'react';
import { render } from '@testing-library/react';
import { Provider } from 'react-redux';
import configureMockStore from 'redux-mock-store';
import Counter from './Counter';

const mockStore = configureMockStore([]);

describe('Counter component', () => {
  it('Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅', () => {
    const store = mockStore({ counter: { count: 0 } });

    const { getByText } = render(
      <Provider store={store}>
        <Counter />
      </Provider>
    );

    expect(getByText('Count: 0')).toBeInTheDocument();
  });
});
πŸ”Ή ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ совСты 1. ВСстируйтС reducers ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ: Π­Ρ‚ΠΎ чистыС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡ… Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅ всСго. 2. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠΊΠΈ для API-запросов: jest.fn() ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ msw. 3. ВСстируйтС взаимодСйствиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с Redux: Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ mock-store ΠΈΠ»ΠΈ настоящСго Redux-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π² тСстовой срСдС. 🎯 Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ВСстированиС Redux β€” ваТная Ρ‡Π°ΡΡ‚ΡŒ создания ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΈ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. НачнитС с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ reducers, Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΊ actions, Π° послС - ΠΊ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² с использованиСм mock-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°. ReactJs Daily | #testing
Love Center - Dating, Friends & Matches, NY, LA, Dubai, Global
Love Center - Dating, Friends & Matches, NY, LA, Dubai, Global
Find friends or serious relationships easily