1.1.0 • Published 9 years ago

saywhen v1.1.0

Weekly downloads
79
License
Apache-2.0
Repository
github
Last release
9 years ago

saywhen

Build Status npm version

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.

1.1.0

9 years ago

1.0.0

9 years ago

0.0.3

9 years ago

0.0.2

9 years ago

0.0.1

9 years ago