Nock not working for multiple tests running together

nock, node.js

Solution

As discussed in this Github Issue, `nock.restore()` removes the http interceptor itself. When you run `nock.isActive()` after calling `nock.restore()` it will return `false`. So you need to run `nock.activate()` before using it again.

Solution 1:

Remove `nock.restore()`.

Solution 2:

Have this `before()` method in your test.

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

Problem

I am using `nock` library to stub my http calls. Different test files `require('nock')` and do their stubbing. If each test is run separately, all is passing. But if all tests run together, later tests fail because instead of nock, actual request was made. Consider below code snippet for example. It has two different `describe` blocks, each with multiple test cases. If I run this file `node node_modules/mocha/bin/_mocha test.js` then the first two tests will pass, but the third test (in different `describe` block) would fail because it would actually call the `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() }) }) }) ``` Funny thing is, if I do `console.log(nock.activeMocks())`, then I can see that nock did register the URL to mock. ``` [ 'POST http://google.com:80/path3' ] ```

Original source