Package Exports
- sinon-matchers
- sinon-matchers/dist/sinon-matchers.cjs.js
- sinon-matchers/dist/sinon-matchers.esm.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (sinon-matchers) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
sinon-matchers
sinon-matchers is a collection of assertions for using the mocking library
Sinon.js with most any testing framework that supports expect.extend
(e.g. Jest, Playwright, and Vitest).
This project was created as a fork of the excellent
jest-sinon because, while it worked
seamlessly with Jest, was not compatible with testing frameworks like Playwright
due to Playwright's lack of a global expect
object. Therefore,
Example
const bar = () => {};
const foo = sinon.spy();
foo(bar);
// instead of:
expect(foo.calledWith(bar)).toBeTruthy;
// we can write:
expect(foo).toHaveBeenCalledWith(bar);
The assertions: toHaveBeenCalledTimes
, toThrow
, toReturnWith
, toHaveBeenCalled
and toHaveBeenCalledWith
clash with the in-built Jest
mocking framework. sinon-matchers
will try and detect which type of spy is being used and use the correct assertion. You should be able to use both mocking libraries in parallel.
const foo = sinon.spy();
foo();
expect(foo).toHaveBeenCalled(); // true
Why?
There are a number of reasons why you might want to use Sinon.js
instead of (or as well as) the in-built mocking assertions. Some of the use cases include:
- Developer preference/familiarity to Sinon.js
- Migrating a code base from Mocha/Chai/Sinon to Jest
- To be difficult
Ultimately, it usually comes down to your own preferences and needs.
Installation
With npm:
npm install --save-dev sinon-matchers
With yarn:
yarn add -D sinon-matchers
Setup
Jest 24+
Add sinon-matchers
to your Jest setupFilesAfterEnv
configuration.
// jest.config.js
export default {
// ...
setupFilesAfterEnv: "./testSetup.js"
};
// testSetup.js
const matchers = require('sinon-matchers');
expect.extend(matchers);
Jest 23 or below
// jest.config.js
export default {
// ...
setupTestFrameworkScriptFile: "./testSetup.js"
};
// testSetup.js
const matchers = require('sinon-matchers');
expect.extend(matchers);
Playwright
// test/global-setup.js
import { expect } from '@playwright/test';
import matchers from 'sinon-matchers';
expect.extend(matchers);
Vitest
// vite.config.js
export default {
// ...
test: {
setupFiles: ['test/setupTests.ts'],
}
}
// test/setupTests.js
import { expect } from 'vitest'
import matchers from 'sinon-matchers';
expect.extend(matchers);
Usage
sinon-matchers
adds a number of assertions to help test Sinon.js
Spies, Mocks and Stubs. Below is a list of currently implemented assertions.
.toHaveBeenAlwaysCalledOn(obj)
Also under the alias:
.toBeAlwaysCalledOn()
.toHaveBeenAlwaysCalledWith(args1, arg2, ...)
Also under the alias:
.toBeAlwaysCalledWith()
.toHaveBeenAlwaysCalledWithExactly(args1, arg2, ...)
Also under the alias:
.toBeAlwaysCalledWithExactly()
.toHaveBeenAlwaysCalledWithMatch(arg1, arg2, ...)
Also under the alias:
.toBeAlwaysCalledWithMatch()
.toHaveBeenAlwaysCalledWithNew()
Also under the alias:
.toBeAlwaysCalledWithNew()
.toHaveBeenCalled()
Also under the alias:
.toBeCalled()
.toHaveBeenCalledAfter(anotherSpy)
Also under the alias:
.toBeCalledAfter()
.toHaveBeenCalledBefore(anotherSpy)
Also under the alias:
.toBeCalledBefore()
.toHaveBeenCalledImmediatelyAfter(anotherSpy)
Also under the alias:
.toBeCalledImmediatelyAfter()
.toHaveBeenCalledImmediatelyBefore(anotherSpy)
Also under the alias:
.toBeCalledImmediatelyBefore()
.toHaveBeenCalledOn(obj)
Also under the alias:
.toBeCalledOn()
.toHaveBeenCalledOnce()
Also under the alias:
.toBeCalledOnce()
.toHaveBeenCalledOnceWith(arg1, arg2, ...)
Also under the alias:
.toBeCalledOnceWith()
.toHaveBeenCalledOnceWithExactly(arg1, arg2, ...)
Also under the alias:
.toBeCalledOnceWithExactly()
.toHaveBeenCalledThrice()
Also under the alias:
.toBeCalledThrice()
.toHaveBeenCalledTwice()
Also under the alias:
.toBeCalledTwice()
.toHaveBeenCalledWith(arg1, arg2, ...)
Also under the alias:
.toBeCalledWith()
.toHaveBeenCalledWithExactly(arg1, arg2, ...)
Also under the alias:
.toBeCalledWithExactly()
.toHaveBeenCalledWithMatch(arg1, arg2, ...)
Also under the alias:
.toBeCalledWithMatch()
.toHaveBeenCalledWithNew()
Also under the alias:
.toBeCalledWithNew()
.toHaveCallCount(number)
Also under the alias:
.toHaveBeenCalledTimes()
and.toBeCalledTimes()
.toHaveReturnedWith(obj)
Also under the alias:
.toReturnWith()
,.toHaveReturned()
and.toReturn()
.toHaveAlwaysReturnedWith(obj)
Also under the alias:
.toAlwaysReturnWith()
.toHaveThrown(error?)
Also under the alias:
.toHaveThrownError()
,.toThrow()
, and.toThrowError()
.toHaveAlwaysThrown(error?)
Also under the alias:
.toHaveAlwaysThrownError()
,.toAlwaysThrow()
and.toAlwaysThrowError()
For more information about what these do, you can visit Sinon.js.
Contributing
Pull requests for new features, bug fixes, and suggestions are welcome!