mm icon indicating copy to clipboard operation
mm copied to clipboard

Restore function affects the http.request unexpectly

Open xavierchow opened this issue 10 years ago • 4 comments

Some other libraries such as nock also alter the http.request, as long as you require the mm, even you don't use the mm.http.request, the restore changes it with the origin one(at the context of require moment) by force, which is not expected, see sample below,

var assert = require('assert');
var http = require('http');
var mm = require('mm');

var obj = {
  foo: function () {
    console.log('original foo called');
  }
};
mm(obj, 'foo', function () {
  console.log("mocked foo called");
});
obj.foo();

//Manually override the http.request for certain purpose.
http.request = function (option, callback) {
 throw new Error('Never want to send request out');
} 

mm.restore();
try {
  http.get({ path: '/foo' }, function (res) {});
} catch (e) {
  //assert here failed, because the restore made the overriding above invalid
  assert.equal(e.message, 'Never want to send request out');
}

xavierchow avatar Nov 29 '15 09:11 xavierchow

This issue would occurs when mm and nock be used together?

alsotang avatar Nov 30 '15 03:11 alsotang

This issue would occurs when mm and nock be used together?

Yes, also other modules which alter the underlying http.request.

xavierchow avatar Nov 30 '15 03:11 xavierchow

it is most likely two hacks can not work correctly together..

I think this issue is inevitable, but yes we can attempt to avoid them

2015-11-30 11:09 GMT+08:00 xavier [email protected]:

This issue would occurs when mm and nock be used together?

Yes, also other modules which alter the underlying http.request.

— Reply to this email directly or view it on GitHub https://github.com/node-modules/mm/issues/24#issuecomment-160505620.

alsotang avatar Nov 30 '15 03:11 alsotang

It's fine if I use mm.http.request and there's a conflict with other lib which also changes http.request. But even if I only use the stub feature(underlying muk), the mm.restore still touches the http.request by force. That's the problem I think mm.restore does too much.

xavierchow avatar Nov 30 '15 03:11 xavierchow