Nock 不适用于同时运行的多个测试

Posted

技术标签:

【中文标题】Nock 不适用于同时运行的多个测试【英文标题】:Nock not working for multiple tests running together 【发布时间】:2018-03-29 18:51:53 【问题描述】:

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

以下面的代码 sn-p 为例。它有两个不同的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' ]

【问题讨论】:

【参考方案1】:

正如Github Issue 中所讨论的,nock.restore() 删除了 http 拦截器本身。当您在调用nock.restore() 后运行nock.isActive() 时,它将返回false。所以你需要在再次使用之前运行nock.activate()

解决方案 1:

删除nock.restore()

解决方案 2:

在您的测试中使用此 before() 方法。

  before(function (done) 
    if (!nock.isActive()) nock.activate()
    done()
  )

【讨论】:

谢谢!你节省了我几分钟在文档中跟踪的时间! 你能解释一下你的问题是什么,如果有任何错误信息吗? 我的 before 是异步的,这就是为什么我不能使用 done()。我将 nock.cleanAll() 放入 afterEach 我不确定您之前所说的异步是什么意思...如果可能的话,您为什么不发布另一个问题并将链接发送给我...我会尽力回答。 我在另一个文件中使用 dotenv 包。我认为 dotenv 导致不使用 nock 模拟 url。如果我删除 dotenv,那么它可以工作,但如果我保留 dotenv,它会从 env 请求原始 url。 :(

以上是关于Nock 不适用于同时运行的多个测试的主要内容,如果未能解决你的问题,请参考以下文章

比较并交换不适用于许多核心

使用 Detox 和 Nock 模拟 API 调用

使用 AttributeConverter 的 Spring Boot 测试不适用于 Maven 测试

Codemagic 不适用于 iOS 中的自定义运行脚本?

React API 测试与 Nock 失败并出现“错误:Nock:请求不匹配”

如何使用 Nock 测试请求中的错误?