Mając problemy za pomocą nock , aby przetestować moje twórcy akcji Redux. Kiedy przejdę offline, stają się nieudane obiecuje, co oznacza, że żądanie HTTP za pomocą AXIOS nie powiodło się. Kiedy idę jednak online, działa jednak.

Czy nock działa tylko wtedy, gdy istnieje połączenie internetowe?

Twórca akcji (wykorzystuje AXIOS 0,15.3)

export const fetchSomething = (id) => {
  return dispatch => {
    dispatch({
      type: FETCH_SOMETHING_LOADING
    });

    return axios.get(`${SOMEWHERE}/something?id=${id}`)
      .then(response => {
        return dispatch({
          type: FETCH_SOMETHING_SUCCESS,
          payload: response.data
        });
      })
      .catch(error => {
        return dispatch({
          type: FETCH_SOMETHING_FAILURE
        });
      });
  };
};

jedź test dla twórcy akcji (NOCK V9.0.2)

test('should dispatch success action type if data is fetched successfully', () => {
  // Need this in order for axios to work with nock
  axios.defaults.adapter = require('axios/lib/adapters/http');

  nock(SOMEWHERE)
    .get('/something?id=123')
    .reply(200, someFakeObject);

  thunk = fetchSomething(123);

  return thunk(dispatch)
    .then(() => {
      expect(dispatch.mock.calls[1][0].type).toBe('FETCH_SOMETHING_SUCCESS');
    });
});
1
nbkhope 17 luty 2017, 02:03

2 odpowiedzi

Najlepsza odpowiedź

Wydaje się, że niektóre problemy z użyciem NOCK do żądań testowych wykonanych przez AXIOS. Jest to Wydanie w repozytorium Nock o tym dyskutuje.

Odkryłem, że @supnate komentarz na ten problem rozwiązany mój problem. Ponadto miałem w moim kodzie wezwanie do nock.cleanAll(); w konstrukcji beforeEach(), która była główna winprit problemu.

Rozwiązaniem jest usunięcie tego. Nie używaj nock.cleanAll()! Teraz wszystko działa dobrze do testów złożonych przez AXIOS:

import axios from 'axios';
import httpAdapter from 'axios/lib/adapters/http';

axios.defaults.host = SOMEWHERE; // e.g. http://www.somewhere.com
axios.defaults.adapter = httpAdapter;

describe('Your Test', () => {
  test('should do something', () => {
    nock(SOMEWHERE)
      .get('/some/thing/3')
      .reply(200, { some: 'thing', bla: 123 });  

    // then test your stuff here
  );
});
0
nbkhope 21 marzec 2017, 17:13

O ile wiem, moduł NPM nock działa tylko w węźle, a nie w przeglądarce. Czy używasz Nock w pakiecie testowym lub jako wypełnienie do twojego API podczas rozwijania? Jeśli to jest ten ostatni, nie sądzę, aby Nock Middleware będzie działać. Prawdopodobnie widzisz odpowiedź z prawdziwego interfejsu API, a nie Mock API, gdy jesteś połączony z Internetem, a Nock nie przechwytuje niczego.

Jeśli chcesz spróbować podobnego adaptera, który działa zarówno w węźle, jak iw przeglądarce, spójrz na axios-mock-adapter

0
Yo Wakita 17 luty 2017, 00:32