samedi 23 juillet 2016

How to mock request module with rewire?

I have a custom module tokens.js with a function which makes requests via npm request module. It looks like this:

'use strict';

let request = require('request');

module.exports.getToken = function(code, cb) {
  let url = 'some_url';

  request(url, function (err, response, body) {
    if (err) {
      return cb(err);
    } else if (response.statusCode !== 200) {
      return cb('err');
    }

    parseGetResponse(body, function (err, token) {
      if (err) {
        return cb(err);
      }

      return cb(null, token);
  });
});

I'd like to write unit tests to cover getToken() function, but I have some troubles with mocking request module.

I tried this:

let mocha = require('mocha');
let rewire = require('rewire');
let should = require('should');

let requestMock = {
  request: function (url, cb) {
      // return cb(); etc
  }
}

let tokens = rewire('services/tokens.js');
tokens.__set__('request', requestMock);

But this approach doesn't work:

TypeError: request is not a function
  at Object.module.exports.getToken (services/tokens.js)

Actually, it leads to another question: How request module may works without directly calling exported function (request.request(url, cb))? And how should I use rewire with this?

Aucun commentaire:

Enregistrer un commentaire