gpt4 book ai didi

node.js - Nock 未在 Redux 测试中拦截 API 调用

转载 作者:搜寻专家 更新时间:2023-10-31 22:20:36 25 4
gpt4 key购买 nike

我正在尝试在 redux 应用程序中测试 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 响应。

这是 Action 创建者本身:

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 似乎正在将端口 80 添加到 url,不确定这是否会导致实际 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 会覆盖 node http 行为,因此它仅适用于 node 而不是浏览器(如 PhantomJS)。

例如,您指出的链接使用的是 Jest,第一行明确说明了 Node 环境。因此,nock 将作为一种魅力。 http://redux.js.org/docs/recipes/WritingTests.html

Setting Up

We recommend Jest as the testing engine. Note that it runsin a Node environment, so you won't have access to the DOM.

据我所知,您可以:

  • 在 Node 环境中运行测试
  • 或者使用不同的库来模拟 fetch-mock

关于node.js - Nock 未在 Redux 测试中拦截 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36240538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com