node-modules / mm

An simple but flexible mock(or say stub) package, mock mate
Other
158 stars 16 forks source link

Restore function affects the http.request unexpectly #24

Open xavierchow opened 8 years ago

xavierchow commented 8 years ago

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');
}
alsotang commented 8 years ago

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

xavierchow commented 8 years ago

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

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

alsotang commented 8 years ago

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 notifications@github.com:

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.

xavierchow commented 8 years ago

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.