a_mock
v2.0.5
Published
Sub package of a. Mocking framework
Downloads
14,439
Readme
a_mock
Mocking framework
The mocking framework can be used in any JavaScript testing framework.
To install:
npm install a_mockMocking
Mocking a function
Partial mock
var original = function() {
return 'realValue';
}
var mock = require('a_mock').mock(original);
original = mock;
mock.expect().return('fake');
original(); //returns 'fake'
original(); //returns 'realValue'Note: Consumers do not need to provide a thisArg. It is optional and only used to force a specific this when the original fallback is called (low-level partial mock usage).
Strict mock
var mock = require('a_mock').mock();
mock.expect().return('fake');
mock(); //returns 'fake'
mock(); //throws unexpected argumentsExpecting arguments
var mock = require('a_mock').mock();
mock.expect('testValue1').return('fake1');
mock.expect('testValue2').return('fake2');
mock('testValue1'); //returns 'fake1'
mock('testValue2'); //returns 'fake2'
mock(); //throws unexpected arguments
mock('foo'); //throws unexpected argumentsExpecting multiple arguments
var mock = require('a_mock').mock();
mock.expect('firstArg1', 'secondArg1').return('fake1');
mock.expect('firstArg2', 'secondArg2').return('fake2');
mock('firstArg1', 'secondArg1'); //returns 'fake1'
mock('firstArg2', 'secondArg2'); //returns 'fake2'
mock('foo'); //throws unexpected arguments
mock('foo', 'bar'); //throws unexpected argumentsExpecting array
var mock = require('a_mock').mock();
mock.expect(['a','b']).return('fake1');
mock.expect(['a','b']).return('fake2');
mock.expect(['c','d').return('fake3');
mock(['a','b']); //returns 'fake1'
mock(['a','b']); //returns 'fake2'
mock(['c','d']); //returns 'fake3'
mock(['a','b']); //throws unexpected arguments
mock(['foo', 'bar']); //throws unexpected argumentsExpecting struct
var mock = require('a_mock').mock();
var obj = {};
mock.expect({a : 1}).return('fake1');
mock.expect({a : 2}).return('fake2');
mock.expect({a : 2, b : {c : 'foo', d : ['me', 'too']}}).return('fake3');
mock.expect(obj).return('fake4');
mock.expect({}).return('will never happen');
mock({a : 'x'}); //throws unexpected arguments
mock({a : 1}); //returns 'fake1'
mock({a : 2}); //returns 'fake2'
mock({a : 2, b : {c : 'foo', d : ['me', 'too']}}); //returns 'fake3'
mock(obj); //returns 'fake4'
mock({}); //throws unexpected arguments cause leaf properties are not equalNote: Struct matching is strict on leaf properties. All leaf property values must be equal to match, and an empty object does not match a non-empty expected struct.
Repeats
var mock = require('a_mock').mock();
mock.expect().return('fake').repeat(2);
mock(); //returns 'fake'
mock(); //returns 'fake'
mock(); //throws unexpected argumentsInfinite repeats
var mock = require('a_mock').mock();
mock.expect().return('fake').repeatAny();
mock(); //returns 'fake'
mock(); //returns 'fake'
mock(); //returns 'fake'...Ignoring a single argument
var mock = require('a_mock').mock();
mock.ignore().expect('foo').return('fake1');
mock('ignore me', 'foo'); //returns 'fake1'
mock(); //throws unexpected argumentsIgnoring all arguments
var mock = require('a_mock').mock();
mock.ignoreAll().return('fake1'); //same as expectAnything
mock('someRandomValue', 'whatever'); //returns 'fake1'
mock(); //throws unexpected argumentsThrowing exceptions
var mock = require('a_mock').mock();
var error = new Error('invalid operation');
mock.expect().throw(error);
mock.expect().return('fake');
mock(); //throws error
mock(); //returns 'fake'Intercepting
var mock = require('a_mock').mock();
mock.expect('testValue').whenCalled(onCalled).return('fake1');
function onCalled(arg) {
//arg == 'testValue'
}
mock('testValue'); //returns 'fake1'
mock(); //throws unexpected argumentsVerify (fail)
var mock = require('a_mock').mock();
mock.expect('testValue1').return('fake1');
mock.expect('testValue2').return('fake2');
mock('testValue1'); //returns 'fake1'
mock.verify(); //throws mock has 1 pending functionsVerify (success)
var mock = require('a_mock').mock();
mock.expect('testValue1').return('fake1');
mock.expect('testValue2').return('fake2');
mock('testValue1'); //returns 'fake1'
mock('testValue2'); //returns 'fake2'
mock.verify(); //returns truereturning void (compact syntax)
var mock = require('a_mock').mock();
mock.expect('testValue1');
mock.expect('testValue2').repeat(2);
mock('testValue1'); //returns undefined
mock('testValue2'); //returns undefined
mock('testValue2'); //returns undefined
mock.verify(); //returns true..is equivalent to ..
var mock = require('a_mock').mock();
mock.expect('testValue1').return();
mock.expect('testValue2').return().repeat(2);
mock('testValue1'); //returns undefined
mock('testValue2'); //returns undefined
mock('testValue2'); //returns undefined
mock.verify(); //returns trueReset mock
var original = function() {
return 'realValue';
}
var mock = require('a_mock').mock(original);
original = mock;
mock.expect().return('fake');
mock.reset();
original(); //returns 'realValue'Returning resolved promise
var mock = require('a_mock').mock();
mock.expect('foo').resolve('fake');
mock('foo').then(function(returned){
//returned == 'fake'
}); Returning rejected promise
var mock = require('a_mock').mock();
mock.expect('foo').reject('fake');
mock('foo').then(null, function(returned){
//returned == 'fake'
}); Strict mock - advanced scenario
var mock = require('a_mock').mock();
mock.expect('testValue').ignore().whenCalled(onCalled).return('fake1');
function onCalled(arg,callback) {
//arg == 'testValue'
//callback == foo
}
function foo() {
}
mock('testValue', foo); //returns 'fake1'
mock.verify() //returns true
mock('testValue',foo); //throws unexpected argumentsMocking require
expectRequire
var fakeDep = {};
var expectRequire = require('a_mock').expectRequire;
expectRequire('./realDep').return(fakeDep);
require('./realDep'); //returns fakeDep
require('./realDep'); //returns realDep (behaves like a partial mock)requireMock (compact syntax)
var requireMock = require('a_mock').requireMock;
var fakeDep = requireMock('./realDep'); //returns a strict mock
require('./realDep'); //returns fakeDep
require('./realDep'); //returns realDep..is equivalent to ..
var mock = require('a_mock').mock();
var expectRequire = require('a_mock').expectRequire;
var fakeDep = mock;
expectRequire('./realDep').return(fakeDep);
require('./realDep'); //returns fakeDep
require('./realDep'); //returns realDepReset mocks for require
var fakeDep = {};
var expectRequire = require('a_mock').expectRequire;
expectRequire('./realDep').return(fakeDep);
expectRequire.reset();
require('./realDep'); //returns realDep..is equivalent to ..
var requireMock = require('a_mock').requireMock;
var fakeDep = requireMock('./realDep'); //returns a strict mock
requireMock.reset(); //is an alias for expectRequire.reset()
require('./realDep'); //returns realDep
Mocking an object
Partial object mock
function newCustomer(_name) {
var c = {};
c.getName = function ()
{
return _name;
};
return c;
}
var customer = newCustomer('Alfonzo The Real');
var customerMock = mock(customer);
customerMock.getName.expect().return('Johnny Fake');
customer.getName(); //returns Johnny Fake
customer.getName(); //returns Alfonzo The Real
customerMock.verify(); //returns trueMocking promises
Mocking resolve
var a = require('a_mock');
var promise = a.promise(); //mocked promise
promise.then(success,error);
promise.resolve('success');
function success(arg) {
console.log(arg);//success
}
function error(e) {
//will not happen
}Mocking resolve (alternative syntax)
var a = require('a_mock');
var promise = a.promise(); //mocked promise
promise.then(success,error);
promise('success');
function success(arg) {
console.log(arg);//success
}
function error(e) {
//will not happen
}Mocking reject
var a = require('a_mock');
var promise = a.promise();
promise.then(success,error);
promise.reject(new Error('error'));
function success(arg) {
//will not happen
}
function error(e) {
console.log(e.stack);//will happen
}Mocking reject (alternative syntax)
var a = require('a_mock');
var promise = a.promise();
promise.then(success,error);
promise(null,new Error('error'));
function success(arg) {
//will not happen
}
function error(e) {
console.log(e.stack);//will happen
}