Тестирование аксиомов с помощью Sinon, с сокращением и кармой

Здравствуйте, в документации по редукту для тестирования у них есть этот пример для тестирования вызовов api:

import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'
import * as actions from '../../actions/counter'
import * as types from '../../constants/ActionTypes'
import nock from 'nock'

const middlewares = [ thunk ]
const mockStore = configureMockStore(middlewares)

describe('async actions', () => {
  afterEach(() => {
    nock.cleanAll()
  })

  it('creates FETCH_TODOS_SUCCESS when fetching todos has been done', (done) => {
    nock('http://example.com/')
      .get('/todos')
      .reply(200, { body: { todos: ['do something'] }})

    const expectedActions = [
      { type: types.FETCH_TODOS_REQUEST },
      { type: types.FETCH_TODOS_SUCCESS, body: { todos: ['do something']  } }
    ]
    const store = mockStore({ todos: [] }, expectedActions, done)
    store.dispatch(actions.fetchTodos())
  })
})

Я использую среду проверки кармы, и я думаю, что не могу использовать нок для проверки этого. Поэтому я изучал это, используя Sinon. Проблема в том, что я не понимаю, как я буду тестировать, используя это, поскольку я не передаю обратный вызов в свой вызов функции api. Я использую axios для вызова моего внешнего API.

Ответ 1

Для этого вы должны использовать axios-mock-adapter

Пример:

import MockAdapter from 'axios-mock-adapter';
import axios from 'axios';
import thunk from 'redux-thunk';
import configureMockStore from 'redux-mock-store';
import * as actionTypes from './userConstants';
import * as actions from './userActions';


const mockAxios = new MockAdapter(axios);
const mockStore = configureMockStore(middlewares);

describe('fetchCurrentUser', () => {
  afterEach(() => {
    mockAxios.reset();
  });

  context('when request succeeds', () => {
    it('dispatches FETCH_CURRENT_USER_SUCCESS', () => {
      mockAxios.onGet('/api/v1/user/current').reply(200, {});

      const expectedActions = [
        { type: actionTypes.SET_IS_FETCHING_CURRENT_USER },
        { type: actionTypes.FETCH_CURRENT_USER_SUCCESS, user: {} }
      ];

      const store = mockStore({ users: Map() });

      return store.dispatch(actions.fetchCurrentUser()).then(() =>
        expect(store.getActions()).to.eql(expectedActions)
      );
    });
  });

Ответ 2

Я не эксперт по асинхронным действиям, так как в моем приложении я тестирую все эти вещи отдельно (создатель действий, вызовы api с нокмером службы, асинхронное поведение благодаря saga, однако в коде документации redux это выглядит как

    const store = mockStore({ todos: [] })

    return store.dispatch(actions.fetchTodos())
      .then(() => { // return of async actions
        expect(store.getActions()).toEqual(expectedActions)
      })

Итак, отправка возвращает ваше асинхронное действие, и вам нужно пройти тест в функции, которая будет выполняться при разрешении вашего действия async. Нокирование конечной точки должно работать нормально.