2017-02-16 2 views
0

Ich habe Probleme mit nock, um meine Redux-Aktion Schöpfer zu testen. Wenn ich offline gehe, bekomme ich immer wieder fehlgeschlagene Versprechen, was bedeutet, dass die HTTP-Anfrage mit Axios nicht erfolgreich war. Wenn ich online gehe, funktioniert es allerdings.Funktioniert Nock nur, wenn eine Internetverbindung besteht?

Funktioniert Nock nur, wenn eine Internetverbindung besteht?

Aktion Creator (verwendet 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 
     }); 
     }); 
    }; 
}; 

Jest Test für die Aktion Schöpfer (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'); 
    }); 
}); 

Antwort

0

Es scheint bei der Verwendung von Nock einige Probleme zu Anfragen von axios gemacht zu testen. Es gibt eine issue in nock's repository, die das diskutiert.

Ich fand, dass @supnate Kommentar zu diesem Problem mein Problem gelöst hat. Außerdem hatte ich in meinem Code einen Anruf an nock.cleanAll(); innerhalb eines beforeEach() Konstrukts, das der Hauptschuldige des Problems war.

Die Lösung ist, das zu entfernen. Verwenden Sie nicht nock.cleanAll()! Jetzt funktioniert alles gut, um Anfragen von Axios zu testen:

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

Soweit ich weiß, , das nock npm Modul funktioniert nur in Node und nicht im Browser. Verwenden Sie Nock in Ihrer Testsuite oder als Fill-In für Ihre API während der Entwicklung? Wenn es das letztere ist, glaube ich nicht, dass die Nock-Middleware funktionieren wird. Sie sehen wahrscheinlich eine Antwort von der echten API und nicht von der Mock-API, wenn Sie mit dem Internet verbunden sind und Nock nichts abfängt.

Wenn Sie möchten, dass ein ähnliches Adapter, um zu versuchen, die sowohl in Knoten und im Browser funktioniert, werfen Sie einen Blick auf axios-mock-adapter

+0

Ich benutze Axios, um HTTP-Aufrufe in meiner Aktion Schöpfer zu machen. Zum Testen verwende ich Jest und rufe an, um einen Interceptor einzurichten. Es scheint, dass Interceptor überhaupt nicht verwendet wird. Wenn ich offline gehe (oder nock.disableNetConnect() aufrufen), schlägt mein axios.get fehl und geht zu seinem catch-Block. – nbkhope

+0

Können Sie Ihre Frage so bearbeiten, dass sie Ihren Testfall enthält? –

Verwandte Themen