2016-03-26 36 views
7

Próbuję przetestować wywołanie api w aplikacji redux. Kod całkiem dużo następujący wzór opisaną w asynchroniczne Creators akcji części docs Redux:Nock nie przechwytuje wywołania API w teście Redux

http://redux.js.org/docs/recipes/WritingTests.html

Istotą jest to, że używasz redux-makiety magazynu nagrywać i dochodzić od wszelkie uruchomione akcje.

Jest cała testy, używając Nock mock wywołanie API:

import React from 'React' 
import ReactDOM from 'react-dom' 
import expect from 'expect'; 
import expectJSX from 'expect-jsx'; 
import TestUtils from 'react-addons-test-utils' 
import configureMockStore from 'redux-mock-store' 
import thunk from 'redux-thunk' 
import nock from 'nock' 
expect.extend(expectJSX); 

import * as types from '../../constants/Actions' 

describe('Async Search Actions',() => { 
    const thunkMiddleware = [ thunk ]; 
    /* use redux-mock-store here */ 
    const mockStore = configureMockStore(thunkMiddleware); 


    describe('The fetchArtistData action creator should',() => { 

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

     it('Should fire off a ARTIST action when fetch is done', (done) => { 
      nock('http://ws.audioscrobbler.com') 
       .get('/2.0/') 
       .query({method: 'artist.search', artist: 'ho', api_key: 'abc123', format: 'json', limit: 5}) 
       .reply(200, 
         { 
         fake: true 
         } 
        ) 



      const expectedActions = [ 
       { type: types.ARTIST, artists: { 
         fake: true 
        } 
       } 
      ]; 

      let store = mockStore([], expectedActions, done); 
      store.dispatch(fetchArtist('ho')) 

     }); 

    }); 

}); 

Wydaje się jednak, że prawdziwym LastFM API jest wywoływana, gdy badanie przeprowadzane jest ... prawdziwe dane są zwracane z LastFM raczej niż fałszywa odpowiedź nock.

Jest twórcą akcja sama:

export function fetchArtist(search) { 
    return dispatch => { 
     return fetch(`http://ws.audioscrobbler.com/2.0/?method=artist.search&artist=${search}&api_key=abc123&format=json&limit=5`) 
      .then(handleErrors) 
      .then(response => response.json()) 
      .then(json => { dispatch(ArtistData(searchTerm, json)) }) 
      .catch(handleServerErrors) 
    } 
} 

Twierdzenie nie powiedzie się, ponieważ na żywo LastFM odpowiedź nie jest taka sama jak odpowiedź Czekam jak na obiekt expectedActions ..

I próbowałem przypisać nock do zmiennej i wylogować. Log pokazuje:

Nock wydaje się dodawać port 80 do adresu URL, nie wiem, czy to powoduje, że rzeczywisty interfejs API nie może zostać wyszydzony:

keyedInterceptors: Object{GET http://ws.audioscrobbler.com:80/2.0/? 
method=artist.search&artist=john&api_key=abc123&format=json&limit=5 

Jakieś pomysły, co jest nie tak?

+1

Czy działa to w węźle albo przeglądarka? Nie wierzę, że nock działa w przeglądarkach, tylko węzeł –

+0

Ach, ok, to jest problem, testuję PhantomJs –

+0

Wygląda na to, że nock nie lubi pobierania przeglądarki https://github.com/node-nock/nock/issues/409. Pójdę, aby spróbować przełączyć się na próbę pobierania zgodnie z sugestią na razie. –

Odpowiedz

0

Musisz podać tylko podstawowy adres URL do głównej funkcji nock i oddzielić część ścieżki adresu URL na metodę .get().

nock('http://ws.audioscrobbler.com') 
    .get('/2.0/') 
    .query({ 
    method: 'artist.search', 
    artist: 'bob', 
    api_key: 'somekey123', 
    format: 'json', 
    limit: '5' 
    }) 
    .reply(200, {fake: true}) 

Udało mi się uzyskać fałszywą odpowiedź z powyższym kodem.

+1

Powinienem wspomnieć, że " d próbował tego - nadal otrzymuję prawdziwe dane z ostatniej kopii z tą konfiguracją –

+0

Dobrze, że musisz opublikować [MCVE] (http://stackoverflow.com/help/mcve), ponieważ jest tu coś innego ale trudno odgadnąć, co to może być. –

+0

Ok dodano trochę więcej szczegółów –

3

Aby użyć nock, należy uruchomić testy w węźle (przy użyciu Jest lub mokka), nock zastępuje zachowanie węzła http i dlatego działa tylko w węźle, a nie w przeglądarkach (np. PhantomJS).

Na przykład link, który wskazałeś, jest oparty na Jest, a pierwsze wiersze zawierają informacje o środowisku węzła. Dlatego nock będzie działał jak urok. http://redux.js.org/docs/recipes/WritingTests.html

Konfigurowanie

Zalecamy żartem jak w silniku testowym. Zauważ, że działa w środowisku węzła, więc nie będziesz mieć dostępu do DOM.

Jak widzę można:

  • uruchomić swoje testy w środowisku węzła
  • lub użyć innej biblioteki wyśmiewać jak fetch-mock
Powiązane problemy