Как я могу проверить асинхронные действия, которые с использованием 'superagent' в моем реактивном проекте с 'Enzyme' и 'Jest'? - PullRequest
0 голосов
/ 21 сентября 2018

Я новичок в тестовой части проекта.

У меня проблема в личном проекте.Я использую 'superagent', чтобы получить информацию от Api, и теперь я хочу написать для нее тест.Но я не могу использовать пакет 'fetch-mock', который использовался в примере с ферментом.

Вот мой файл действий.

   // getRecommendedProductsActions.js

    import request from 'superagent';

    export const getRecommendedProducts = () => (dispatch) => {
      dispatch(fetchProducts());
      return request
        .get(URL_PRODUCT_BASE)
        .set('Content-Type', 'application/json')
        .then(res => dispatch(receiveProducts(res.body)))
        .catch(err => dispatch(receiveFailure(err)));
    };

Вот мой тестовый файл.

// test/getRecommendedProducts.test.js

import configureMockStore from 'redux-mock-store';
import fetchMock from 'fetch-mock';
import thunk from 'redux-thunk';
import { getRecommendedProducts } from '../../src/actions/products';

describe('async actions', () => {
  afterEach(() => {
    fetchMock.reset();
    fetchMock.restore();
  });

  it('creates RECEIVE_PRODUCTS when fetching products has been done', () => {
    fetchMock
      .get('/products', {
        body: httpBody,
        headers: { 'content-type': 'application/json' },
      });

    const expectedActions = successResponse;

    const store = mockStore();

    return store.dispatch(getRecommendedProducts())
      .then(() => expect(store.getActions()).toEqual(expectedActions));
  });

И я обнаружил, что 'superagent' не основан на fetch, а 'fetch-mock' не работает.Я также нахожу файл __mocks__/superagent.js.

// mock for superagent - __mocks__/superagent.js

let mockDelay;
let mockError;
let mockResponse = {
  status() {
    return 200;
  },
  ok() {
    return true;
  },
  body: {
    walla: true,
  },
  get: jest.fn(),
  toError: jest.fn(),
};

const Request = {
  post() {
    return this;
  },
  get() {
    return this;
  },
  send() {
    return this;
  },
  query() {
    return this;
  },
  field() {
    return this;
  },
  set() {
    return this;
  },
  accept() {
    return this;
  },
  timeout() {
    return this;
  },
  end: jest.fn().mockImplementation(function (callback) {
    if (mockDelay) {
      this.delayTimer = setTimeout(callback, 0, mockError, mockResponse);

      return;
    }

    callback(mockError, mockResponse);
  }),
  // expose helper methods for tests to set
  __setMockDelay(boolValue) {
    mockDelay = boolValue;
  },
  __setMockResponse(mockRes) {
    mockResponse = mockRes;
  },
  __setMockError(mockErr) {
    mockError = mockErr;
  },
};

module.exports = Request;

Спасибо за вашу помощь, ребята.

...