在Redux测试中,Nock不拦截API调用

我试图在一个REDX应用程序中测试一个API调用。 该代码非常符合redux文档的Async Action Creators部分中概述的模式:

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

它的要点是你使用redux-mock-store来记录和断言任何触发的动作。

这是整个测试,用nock来模拟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'))

        });

    });

});

但是,似乎真正的lastFm api是在测试运行时调用的......真正的数据是从lastFm返回的,而不是假的nock响应。

这是动作创作者本身:

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

因为现场LastFM等反应是不一样的,我希望按该响应断言失败expectedActions对象..

我试着将nock分配给一个变量并记录下来。日志显示了这一点:

Nock似乎在将URL添加到端口80,不知道这是否导致实际API不被模拟:

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

任何想法这里有什么不对?


为了使用nock,你必须在node中运行你的测试(使用Jest或mocha),nock会覆盖节点的http行为,因此它只能在节点而不是浏览器(如PhantomJS)中工作。

例如,您指出的链接是使用Jest,并且第一行显示了节点环境。 因此,诺克将成为一种魅力。 http://redux.js.org/docs/recipes/WritingTests.html

配置

我们推荐Jest作为测试引擎。 请注意,它在Node环境中运行,因此您将无法访问DOM。

正如我所见,您可以:

  • 在节点环境中运行测试
  • 或者使用不同的库来模拟获取模拟

  • 您只需将基本URL传递给主nock函数,并将URL路径部分分离到.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})
    

    使用上面的代码,我可以得到一个假的回应。

    链接地址: http://www.djcxy.com/p/33001.html

    上一篇: Nock is not intercepting API call in Redux test

    下一篇: No transactionManager error in Grails 3 Integration test