Nock 不适用于一起运行的多个测试

2024-04-09

我在用nock库来存根我的 http 调用。 不同的测试文件require('nock')并做他们的存根。 如果每个测试单独运行,则所有测试都会通过。 但是如果所有测试一起运行,后面的测试就会失败因为发出的不是 nock,而是实际的请求.

例如,考虑下面的代码片段。它有两种不同的describe块,每个块都有多个测试用例。如果我运行这个文件node node_modules/mocha/bin/_mocha test.js那么前两个测试将通过,但第三个测试(在不同的describe块)会失败,因为它实际上会调用google URL.

/* eslint-env mocha */

let expect = require('chai').expect
let nock = require('nock')
let request = require('request')

let url = 'http://localhost:7295'

describe('Test A', function () {
  after(function () {
    nock.restore()
    nock.cleanAll()
  })

  it('test 1', function (done) {
    nock(url)
      .post('/path1')
      .reply(200, 'input_stream1')

    request.post(url + '/path1', function (error, response, body) {
      expect(body).to.equal('input_stream1')
      done()
    })
  })

  it('test 2', function (done) {
    nock(url)
      .post('/path2')
      .reply(200, 'input_stream2')

    request.post(url + '/path2', function (error, response, body) {
      expect(body).to.equal('input_stream2')
      done()
    })
  })
})

// TESTS IN THIS BLOCK WOULD FAIL!!!
describe('Test B', function () {
  after(function () {
    nock.restore()
    nock.cleanAll()
  })

  it('test 3', function (done) {
    nock('http://google.com')
      .post('/path3')
      .reply(200, 'input_stream3')

    request.post('http://google.com' + '/path3', function (error, response, body) {
      expect(body).to.equal('input_stream3')
      done()
    })
  })
})

有趣的是,如果我这样做console.log(nock.activeMocks()),然后我可以看到 nock 确实注册了要模拟的 URL。

[ 'POST http://google.com:80/path3' ]

正如本文所讨论的Github 问题 https://github.com/node-nock/nock/issues/997, nock.restore()删除 http 拦截器本身。当你跑步时nock.isActive()打电话后nock.restore()它会返回false。所以你需要运行nock.activate()再次使用之前。

解决方案一:

Remove nock.restore().

解决方案2:

拥有这个before()方法在你的测试中。

  before(function (done) {
    if (!nock.isActive()) nock.activate()
    done()
  })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nock 不适用于一起运行的多个测试 的相关文章

随机推荐