saywhen
v1.1.0
Published
Better spy fake calls for Jasmine
Downloads
212
Readme
saywhen
Top up your Jasmine spies with better fake calls.
Motivated by the fact that using spies in Jasmine requires a lot of boilerplate to perform different actions depending on provided arguments.
Currently supports Jasmine 2 only. Heavily influenced by the Mockito library for Java.
Turn this...
spy.and.callFake = function(arg) {
if (arg === 'something') {
return 'a value';
} else if (arg === 'something else') {
return 'a different value';
} else {
throw new Error('some error');
}
};
... into this
when(spy).isCalled.thenThrow(new Error('some error'));
when(spy).isCalledWith('something').thenReturn('a value');
when(spy).isCalledWith('something else').thenReturn('a different value');
###Installation
The easiest way to install saywhen
is via npm. Simply run npm install saywhen
in your project directory.
###Usage
Require Say When as a normal module
var when = require('saywhen');
var spy = jasmine.createSpy('foo');
Make a spy return a value when called with a specific argument
when(spy).isCalledWith('foo').thenReturn('bar');
Mix default handlers and specific handlers
when(spy).isCalled.thenReturn(1);
when(spy).isCalledWith('two').thenReturn(2);
spy(); // => 1
spy('bar'); // => 1
spy('two'); // => 2
Make a spy call a particular function, when called with a specific argument
when(spy).isCalledWith('bar').then(function(arg) {
// Do something with arg
});
Make a spy throw an error
when(spy).isCalledWith('baz').thenThrow(new Error());
Works with jasmine.any & jasmine.objectContaining
when(spy).isCalledWith(jasmine.any(String)).thenReturn("string!");
when(spy).isCalledWith(jasmine.objectContaining({
foo : "bar"
})).thenReturn("object!");
spy('abc'); // => string!
spy({ foo : "bar" }); // => object!
Multiple callbacks can be added and will be executed in order
when(spy).isCalled.thenReturn(1)
.thenReturn(2)
.thenReturn(3)
.thenThrow(new Error('eof'));
spy(); // => 1
spy(); // => 2
spy(); // => 3
spy(); // Throws error
Use captors to capture argument values
var captor = when.captor();
when(spy).isCalledWith(jasmine.any(String), captor);
spy("foo", 123);
spy("foo", 456);
spy(null, 789);
captor.values(); // => [123, 456]
captor.latest; // => 456 (last value)
Captors can also wrap matchers, to allow only capture specific arguments
var captor = when.captor(jasmine.any(Number));
when(spy).isCalledWith(captor).then(function(arg) {
return arg * 2;
});
spy(2); // => 4
spy(3); // => 6
spy("foo") // => undefined (doesn't match)
captor.values(); // => [2, 3]
captor.latest; // => 3
###Contributing
Say When is an open source project, maintained by Push Technology. Issues and pull requests are welcomed.
Tests can be run by installing a dev dependencies with npm install
and then running npm test
###License
Licensed under the Apache 2.0 license. See LICENSE.txt.