NodeJS 诺克没有拦截我的请求

e0bqpujr  于 2023-03-17  发布在  Node.js
关注(0)|答案(5)|浏览(145)

我正在尝试用karma服务器和nock做一些基本的测试。看起来nock根本没有拦截我的请求,有人知道吗?我不知道丢失了什么。我仍然得到真实的数据。

nock('https://api.github.com/users/' + username).log(console.log)
.get('/')
.query(true)
.reply(400, {
  statusMessage: 'Bad Request',
  foo: 'foo'
})

http.get('https://api.github.com/users/' + username, function(res) {
  console.log('res', res)
})

我还添加了这个中间件

const middlewares = [thunk];
const mockStore = configureStore(middlewares);

===== 6月6日更新======
使用react-redux的整个流程下面是我的测试:

import configureStore from 'redux-mock-store';
import thunk from 'redux-thunk';
import axios from 'axios';
import expect from 'expect';
import * as actions from 'actions/test-actions'
import * as types from 'types';
import nock from 'nock'
import { username } from 'constansts'

const middlewares = [thunk];
const mockStore = configureStore(middlewares);

describe('Asynchronous actions', () => {
  it('Basic example', done => {
    nock('https://api.github.com')
    .get('/users/' + username)
    .reply(400, {
      statusMessage: 'Bad Request',
      foo: 'foo'
    })

    var expectedActions = []
    let store = mockStore([], expectedActions, done)

    store.dispatch(actions.testRequest())
      .then(() => {
        console.log('store.getActions() => ', store.getActions())
      })
      .then(done).catch((err) => {
        console.log('ERROR==>', err)
        done()
      })
  })
})

接下来是

export function testRequest () {
  return axios.get('https://api.github.com/users/' + username)
  .then(function (res) {
    console.log('response =>', res.status)
  })
  .catch(function (err) {
    console.log('error =>', err)
  })
}

res.status为200,即使我使用nock更改为400

li9yvcax

li9yvcax1#

这是一个老问题,但我相信答案是,您需要设置axios http适配器:

import axios from 'axios';
axios.defaults.adapter = require('axios/lib/adapters/http');

当用jest运行测试时,你通常在一个“类似浏览器”的环境中运行它们,要让axios使用节点http库,你需要特别告诉它使用http适配器。
https://github.com/axios/axios/tree/master/lib/adapters

wnavrhmk

wnavrhmk2#

您应该在get方法中指定路径:

nock('https://api.github.com').log(console.log)
  .get('/users/' + username)
  .query(true)
  .reply(400, {
    statusMessage: 'Bad Request',
    foo: 'foo'
  });
qmb5sa22

qmb5sa223#

您是在节点环境中还是在Web浏览器(如PhantomJS)中运行测试?
为了使用nock,你必须在node中运行测试(使用Jest或mocha),nock覆盖了node的http行为,因此它只能在node中运行,而不能在浏览器(如PhantomJS)中运行。
要运行测试,您可以:

  • 在一个节点环境中运行它(如Jest或摩卡)
  • 或者使用不同的库来模拟fetch-mock
xkrw2x1b

xkrw2x1b4#

我找到答案了!
显然,它与axios不兼容,我也尝试了“fetch”、“isomorphic-fetch”,但没有成功。
答案是“什么东西
非常感谢,我希望这个职位帮助别人.

import 'whatwg-fetch'
export function testRequest () {
  return fetch('https://api.github.com/users/' + username)
  .then(function (res) {
    console.log('response =>', res.status)
  })
  .catch(function (err) {
    console.log('error =>', err)
  })
}
exdqitrt

exdqitrt5#

我最近发布了一个名为wirepig的nock替代方法,由于它不依赖于覆盖任何节点的stdlib内部,因此它与应用程序使用的任何HTTP库都兼容,包括所有版本的axios。
API非常相似;如果你还在纠结这个问题,那就试试吧!

相关问题