http://github.com/chrisleishman/jsmockito
JsMockito is a JavaScript stub/mock framework heavily inspired by Mockito. To quote the mockito website:
"Mockito is a mocking framework that tastes really good. It lets you write beautiful tests with a clean & simple API. Mockito doesn't give you a hangover because the tests are very readable and they produce clean verification errors."
JsMockito aims to try and reproduce the clean & simple API, with a JavaScript twist. And why not add some variation to your drinking habits?
JsMockito must be served with JsHamcrest. Not only do they go well together, it's essential to avoid a very nasty hangover.
To use JsMockito with a JavaScript unit test framework, follow the usual installation/configuration instructions for the framework and plug JsMockito into it. If you're integrating with Screw.Unit (and why wouldn't you?) then you just need to make the following calls:
JsHamcrest.Integration.screwunit();
JsMockito.Integration.screwunit();
var mockedObject = mock(Array);
// -- start code under test --
mockedObject.push("one");
// -- end code under test --
verify(mockedObject).push("one");
var mockedObject = mock(Array);
when(mockedObject).get(1).thenReturn("hello world");
// -- start code under test --
alert(mockedObject.get(1));
// the following alerts 'true' as get(99) was not stubbed
alert(typeof (mockedObject.get(99)) === 'undefined');
// -- end code under test --
mockFunc = mockFunction();
when(mockFunc)(anything()).then(function(arg) {
return "foo " + arg;
});
// -- start code under test --
mockFunc("bar");
// -- end code under test --
verify(mockFunc)(anything());
// or if you want to verify the scope it was called with, use:
verify(mockFunc).call(this, anything())
Real super spies don't drink martinis - they go for mockitos. And just like Mockito, JsMockito supports 'spying' on real functions and objects and verifing how they were interacted with.
An example with functions:
realFunc = function(msg) { alert(msg) };
mockFunc = spy(realFunc);
// -- start code under test --
// the following alerts 'hello world'
mockFunc("hello world");
// -- end code under test --
verify(mockFunc)("hello world");
or with objects:
realObj = new Array();
mockedObj = spy(realObj);
when(mockedObj).pop().thenReturn("bar");
// -- start code under test --
mockedObject.push("foo");
alert(realObj.length); // alerts '1'
alert(mockedObject.pop()); // alerts 'bar'
alert(realObj.length); // still alerts '1'
// -- end code under test --
verify(mockedObject).push("foo");
verify(mockedObject).pop();
For more examples and documentation click here or look in the doc directory.
This variation is served to you by Chris Leishman and friends. Also a big thumbs up and thanks to the Mockito authors for the inspiration!
Also thanks to the JsHamcrest authors, who made this easy.