Skip to content

Commit

Permalink
Merge e43ba47 into 60d2f15
Browse files Browse the repository at this point in the history
  • Loading branch information
dead-horse committed Aug 22, 2015
2 parents 60d2f15 + e43ba47 commit f0535e5
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 25 deletions.
14 changes: 4 additions & 10 deletions lib/es6.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,19 +46,13 @@ mm.data = function (mod, method, data, timeout) {
};

var mockError = mm.error;
mm.error = function (mod, method, error, timeout) {
mm.error = function (mod, method, error, props, timeout) {
if (!is.generatorFunction(mod[method])) {
return mockError.call(mm, mod, method, error, timeout);
return mockError.call(mm, mod, method, error, props, timeout);
}

if (!error) {
error = new Error('mm mock error');
error.name = 'MockError';
}
if (typeof error === 'string') {
error = new Error(error);
error.name = 'MockError';
}
mm._createError(error, props);

if (timeout) {
timeout = parseInt(timeout, 10);
}
Expand Down
47 changes: 32 additions & 15 deletions lib/mm.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,13 @@ function getCallback(args) {
}

/**
* Mock async function error.
* @param {Object} mod, module object
* @param {String} method, mock module object method name.
* @param {String|Error} error, error string message or error instance.
* @param {Number} [tiemout], mock async callback timeout, default is 10.
* create an error instance
*
* @param {String|Error} error
* @param {Object} props
* @return {Error}
*/
exports.error = function (mod, method, error, timeout) {
exports._createError = function (error, props) {
if (!error) {
error = new Error('mm mock error');
error.name = 'MockError';
Expand All @@ -66,6 +66,29 @@ exports.error = function (mod, method, error, timeout) {
error = new Error(error);
error.name = 'MockError';
}
props = props || {};
for (var key in props) {
error[key] = props[key];
}

return error;
};

/**
* Mock async function error.
* @param {Object} mod, module object
* @param {String} method, mock module object method name.
* @param {String|Error} error, error string message or error instance.
* @param {Object} [props], error properties
* @param {Number} [tiemout], mock async callback timeout, default is 10.
*/
exports.error = function (mod, method, error, props, timeout) {
if (typeof props === 'number') {
timeout = props;
props = {};
}
error = exports._createError(error, props);

if (timeout) {
timeout = parseInt(timeout, 10);
}
Expand Down Expand Up @@ -133,16 +156,10 @@ exports.empty = function (mod, method, timeout) {
* @param {Object} mod, module object
* @param {String} method, mock module object method name.
* @param {String|Error} error, error string message or error instance.
* @param {Object} [props], error properties
*/
exports.syncError = function (mod, method, error) {
if (!error) {
error = new Error('mm mock error');
error.name = 'MockError';
}
if (typeof error === 'string') {
error = new Error(error);
error.name = 'MockError';
}
exports.syncError = function (mod, method, error, props) {
error = exports._createError(error, props);
mock(mod, method, function () {
throw error;
});
Expand Down
21 changes: 21 additions & 0 deletions test/es6.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,27 @@ describe('test/es6.test.js', function () {
} catch (err) {
err.message.should.equal('new foo error');
}

mm.error(foo, 'getValue', new Error('new foo error'), {status: 500});
try {
yield* foo.getValue();
throw new Error('should not run this');
} catch (err) {
err.message.should.equal('new foo error');
err.status.should.equal(500);
}

mm.error(foo, 'getValue', new Error('new foo error'), {status: 500}, 100);
try {
var start = Date.now();
yield* foo.getValue();
throw new Error('should not run this');
} catch (err) {
var use = Date.now() - start;
err.message.should.equal('new foo error');
err.status.should.equal(500);
use.should.above(90);
}
});
});
});
27 changes: 27 additions & 0 deletions test/mm.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,18 @@ describe('mm.test.js', function () {
});
});

it('should mock error with properties', function (done) {
mm.error(fs, 'readFile', 'mm mock error', { code: 'ENOENT', name: 'MockError' });
fs.readFile('/etc/hosts', 'utf8', function (err, data) {
should.exist(err);
err.name.should.equal('MockError');
err.message.should.equal('mm mock error');
err.code.should.equal('ENOENT');
should.not.exist(data);
done();
});
});

it('should mock error with 500ms timeout', function (done) {
mm.error(fs, 'readFile', '500ms timeout', 500);
var start = Date.now();
Expand All @@ -205,6 +217,21 @@ describe('mm.test.js', function () {
});
});

it('should mock error with 500ms timeout and properties', function (done) {
mm.error(fs, 'readFile', '500ms timeout', { code: 'ENOENT' }, 500);
var start = Date.now();
fs.readFile('/etc/hosts', 'utf8', function (err, data) {
var use = Date.now() - start;
should.exist(err);
err.name.should.equal('MockError');
err.message.should.equal('500ms timeout');
err.code.should.equal('ENOENT');
should.not.exist(data);
use.should.above(490);
done();
});
});

it.skip('should work for callback is not the last params case', function (done) {
var foo = require('./foo');
done = pedding(3, done);
Expand Down

0 comments on commit f0535e5

Please sign in to comment.