Тестирование действий Redux с ошибками nock и redux-mock-store

Я новичок в тестировании на избыточность и пытаюсь выполнить повторное тестирование для приложения, которое мне очень жаль, если это совершенно неправильный способ тестирования с использованием nock и redux-mock-store.

//Action in authAction.js
export function fetchMessage() {
  return function(dispatch) {
    axios.get(ROOT_URL, {
      headers: { authorization: localStorage.getItem('token') }
    })
      .then(response => {
        console.log("hi")
        dispatch({
          type: FETCH_MESSAGE,
          payload: response.data.message
        });
      })
      .catch(response => {
        console.log(response)
        //callingRefresh(response,"/feature",dispatch);
      });
  }
}

Это метод, и он, кажется, вызывается, но обычно переходит к причине перехвата nock, потому что заголовок не совпадает.

//authActions_test.js
import nock from 'nock'
import React from 'react'
import {expect} from 'chai'
import configureMockStore from 'redux-mock-store'
import thunk from 'redux-thunk'

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

import * as actions from '../../src/actions/authActions';
const ROOT_URL = 'http://localhost:3090';

describe('actions', () => {

    beforeEach(() => {
        nock.disableNetConnect();
        localStorage.setItem("token", '12345');
    });

    afterEach(() => {
        nock.cleanAll();
        nock.enableNetConnect();
    });


  describe('feature', () => {

    it('has the correct type', () => {
      var scope = nock(ROOT_URL).get('/',{reqheaders: {'authorization': '12345'}}).reply(200,{ message: 'Super secret code is ABC123' });
      const store = mockStore({ message: '' });

      store.dispatch(actions.fetchMessage()).then(() => {
      const actions = store.getStore()
      expect(actions.message).toEqual('Super secret code is ABC123');
    })


    });
  });
});

Даже когда заголовок удален и nock перехватывает вызов. Я получаю эту ошибку каждый раз

TypeError: Cannot read property 'then' of undefined
  at Context.<anonymous> (test/actions/authActions_test.js:43:24)

1 ответ

Решение

Вы не возвращаете обещание от Axios, чтобы связать then позвони на.

Измените thunk, чтобы быть как:

//Action in authAction.js
export function fetchMessage() {
  return function(dispatch) {
    return axios.get(ROOT_URL, {
      headers: { authorization: localStorage.getItem('token') }
    })
      .then(response => {
        console.log("hi")
        dispatch({
          type: FETCH_MESSAGE,
          payload: response.data.message
        });
      })
      .catch(response => {
        console.log(response)
        //callingRefresh(response,"/feature",dispatch);
      });
  }
}

Вам также может понадобиться изменить тест, чтобы он не прошел до разрешения обещания. Как это сделать, зависит от того, какую библиотеку тестирования вы используете. Если вы используете мокко, взгляните на этот ответ.

Примечание: я не уверен, что у вас есть другие модульные тесты, тестирующие создателя действий отдельно от редуктора, но это очень интегрированный способ проверить их. Одним из больших преимуществ Redux является то, как легко каждый отдельный зубец машины можно тестировать изолированно друг от друга.

Другие вопросы по тегам