Spies on all Object or Class methods using jest.spyOn
.
If you're sick of writing jest.spyOn(Object, 'method')
all the time.
And you want the following:
- You need to spy on some or all methods of an Object or Class
- You need to define mocks for some methods inside tests (
mockImplementation
ormockReturnValue
) - You need each test to have fresh spies without calling
mockRretore
ormockReset
on each spy - You don't want to manually add a spy for newly added methods
Install as a dev dependency of your project:
yarn add -D jest-spy-object
Or with npm
npm i -D jest-spy-object
const spyObject = require('jest-spy-object');
class Counter {
constructor() {
this.value = 0;
}
incrementBy(val) {
this.value = this.value + val;
}
increment() {
this.incrementBy(1);
}
}
beforeEach(() => {
// Make sure each test starts fresh (can be set in jest.config.js with `restoreMocks: true`)
jest.restoreAllMocks();
// Setup fresh spies
jest.spyOn(Counter.prototype, 'incrementBy');
jest.spyOn(Counter.prototype, 'increment');
});
const spyObject = require('jest-spy-object');
beforeEach(() => {
// Make sure each test starts fresh (can be set in jest.config.js with `restoreMocks: true`)
jest.restoreAllMocks();
// Setup fresh spies
spyObject(Counter);
});
describe('Counter', () => {
it('should be able to spy on class methods and mock any of them easily', () => {
const counter = new Counter();
counter.incrementBy.mockImplementation(function() {
this.value = this.value + 10;
});
counter.increment();
expect(counter.increment).toHaveBeenCalled();
expect(counter.incrementBy).toHaveBeenCalledWith(1);
expect(counter.value).toBe(10);
});
});
function Counter() {
this.value = 0;
}
Counter.prototype.incrementBy = function incrementBy(val) {
this.value = this.value + val;
};
Counter.prototype.increment = function increment() {
this.incrementBy(1);
};
spyObject(Counter);
// or...
spyObject(Counter.prototype);
const counter = {
value: 0,
incrementBy(val) {
this.value = this.value + val;
},
increment() {
this.incrementBy(1);
}
};
spyObject(counter);
See the CONTRIBUTING document.