I needed to spy on functions of an object and quickly came up with this little code to do much as i wanted.. For more advanced spying on javascript functions in your tests, consider using sinon.js or some other framework.
Now to spy on function emit of Dummy socket module below
function Spy(funcName,obj){ var originalFunction ; if(typeof obj === 'object'){ originalFunction = obj[funcName]; } else{ originalFunction = global[funcName] } var numCalled = 0; var invocations = []; var spy = function(){ numCalled++; invocations.push(arguments); if(typeof obj === 'object') return originalFunction.apply(obj,arguments); else return originalFunction.apply(global,arguments); } spy.calledOnce = function(){ return numCalled == 1 ? true : false; } spy.times = function(num){ return num == numCalled ? true : false ; } spy.firstCallWith = function(){ return invocations[0]; } spy.nthCallWith = function(n){ return invocations[n-1]; } if(typeof obj === 'object'){ obj[funcName] = spy; } else { global[funcName] = spy; } return spy; }
var Socket = function(){ function emit(name,message){ } return { "emit" : emit } } exports['Line Parser not invoked since no socket is connected'] = function(test){ test.expect(1); //given var socket = new Socket(); var spy = new Spy("emit" , socket); //Run the test //verify the spy test.ok(spy.calledOnce(), "Socket.emit has been called once"); test.done(); }
No comments:
Post a Comment