2016-03-26 57 views
7

Tôi đang cố kiểm tra cuộc gọi api trong ứng dụng redux. Mã khá nhiều theo mẫu nêu trong Async Tạo Lập Hành động phần của tài liệu Redux:Nock không chặn cuộc gọi API trong kiểm tra Redux

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

các ý chính của nó là bạn sử dụng Redux-giả-store để ghi lại và khẳng định chống lại bất kỳ hành động nào được kích hoạt.

Đây là toàn bộ kiểm tra, sử dụng Nock để thử cuộc gọi 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')) 

     }); 

    }); 

}); 

Nhưng dường như lastfm api thực được gọi khi thử nghiệm được chạy ... dữ liệu thực tế được trả về từ lastfm thay so với phản ứng giả nock.

này là tác giả hành động riêng của mình:

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) 
    } 
} 

Các khẳng định thất bại vì phản ứng lastfm sống là không giống như câu trả lời tôi hy vọng theo đối tượng expectedActions ..

tôi đã cố gắng gán nock cho một biến và đăng xuất. Nhật ký hiển thị điều này:

Nock dường như thêm cổng 80 vào url, không chắc chắn điều này có gây ra API thực tế không bị giả mạo không:

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

Bất kỳ ý tưởng nào sai ở đây?

+1

bạn đang chạy này trong nút hoặc trình duyệt? Tôi không tin rằng nock hoạt động trong trình duyệt, chỉ có nút –

+0

Ah ok, đó là vấn đề sau đó, tôi đang chạy các thử nghiệm trên PhantomJs –

+0

Dường như nock không thích tìm nạp trình duyệt https://github.com/node-nock/nock/issues/409. Sẽ thử và chuyển sang chế độ tìm nạp được đề xuất trong thời gian là –

Trả lời

0

Bạn chỉ cần chuyển URL cơ sở đến hàm nock chính và tách phần đường dẫn URL ra thành phương thức .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}) 

Tôi có thể nhận được phản hồi giả mạo với mã trên.

+1

Tôi nên nói rằng tôi ' d đã cố gắng này - Tôi vẫn nhận được dữ liệu thực sự trở lại từ fm cuối cùng với cấu hình này –

+0

OK bạn sẽ cần phải đăng một [MCVE] (http://stackoverflow.com/help/mcve) như có cái gì khác bị ngắt kết nối ở đây nhưng khó đoán được điều đó có thể là gì. –

+0

Ok đã thêm một số chi tiết khác –

3

Để sử dụng nock, bạn phải chạy thử nghiệm trong nút (sử dụng Jest hoặc mocha), nock ghi đè hành vi http của nút và vì lý do đó nó chỉ hoạt động trong nút chứ không phải trong trình duyệt (như PhantomJS).

Ví dụ: liên kết bạn chỉ ra là sử dụng Jest và dòng đầu tiên có rõ ràng về môi trường nút. Vì vậy, nock sẽ làm việc như một say mê. http://redux.js.org/docs/recipes/WritingTests.html

Thiết lập

Chúng tôi khuyên đùa như các công cụ thử nghiệm. Lưu ý rằng nó chạy trong môi trường Nút, do đó bạn sẽ không có quyền truy cập vào DOM.

Như tôi thấy bạn có thể:

  • chạy thử nghiệm của bạn trong một môi trường nút
  • hoặc sử dụng một thư viện khác nhau để chế nhạo như fetch-mock
Các vấn đề liên quan