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?
Czy działa to w węźle albo przeglądarka? Nie wierzę, że nock działa w przeglądarkach, tylko węzeł –
Ach, ok, to jest problem, testuję PhantomJs –
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. –