Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nock not working for multiple tests running together

Tags:

node.js

nock

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' ]
like image 810
Rash Avatar asked Oct 18 '17 00:10

Rash


1 Answers

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()
  })
like image 117
Rash Avatar answered Sep 27 '22 20:09

Rash