Sentry is an open-source JavaScript SDK published by Sentry to enable error tracking that helps developers monitor and fix crashes in real time.
However, when building tests for your application, you want to assert that the right flow-tracking or error is being sent to Sentry, but without really sending it to Sentry servers. This way you won't swamp Sentry with false reports during test running and other CI operations.
Sentry Testkit enables Sentry to work natively in your application, and by overriding the default Sentry transport mechanism, the report is not really sent but rather logged locally into memory. In this way, the logged reports can be fetched later for your own usage, verification, or any other use you may have in your local developing/testing environment.
npm install sentry-testkit --save-dev
// some.spec.js
const sentryTestkit = require('sentry-testkit')
const {testkit, sentryTransport} = sentryTestkit()
// initialize your Sentry instance with sentryTransport
Sentry.init({
dsn: 'some_dummy_dsn',
transport: sentryTransport,
//... other configurations
})
test('something', function () {
// run any scenario that eventually calls Sentry.captureException(...)
expect(testkit.reports()).toHaveLength(1)
const report = testkit.reports()[0]
expect(report).toHaveProperty(...)
});
Working with Jest
We've added a new option to integrate sentry-testkit
with jest
's mocking mechanism. Detailed implementation can be seen here.
At the moment it is available only to @sentry/browser
package but we will expand to more packages as we should figure out how to do it right for all Sentry's client packages.
If you're using Jest
for testing, all you have to do in your spec.js
file is to import the Jest mock.
// some.spec.js
import { testkit } from 'sentry-testkit/dist/jestMock';
test('something', function () {
// click
// clack
// BOOM!
expect(testkit.reports().length).toBeGreaterThan(0);
});
Make sure to put your
import
statement before all other imports.
Instead of modifying your application code, you can use network interception libraries in conjunction with the testkit.
Example with nock:
const nock = require('nock')
const sentryTestkit = require('sentry-testkit')
const { testkit, initNetworkInterceptor } = sentryTestkit()
beforeAll(() => {
const myAppDSN = '<your DSN goes here>'
initNetworkInterceptor(myAppDSN, (baseUrl, handleRequestBody) => {
// This callback is where we init our interceptor.
// The interceptor should intercept requests from `baseUrl` and pass the
// request body (as json) to the `handleRequestBody` function.
nock(baseUrl)
.persist()
.post(/.*/)
.reply(200, (_, requestBody) => {
handleRequestBody(requestBody)
})
})
})
test('findReport example', async function() {
const err = new Error('error to look for')
// Some faulty scenario that will report err
const report = testkit.findReport(err)
expect(report).toBeDefined()
})
Yes! We 💙 Puppeteer
const sentryTestkit = require('sentry-testkit')
const {testkit} = sentryTestkit()
testkit.puppeteer.startListening(page);
// Run any scenario that will call Sentry.captureException(...), for example:
await page.addScriptTag({ content: `throw new Error('An error');` });
expect(testKit.reports()).toHaveLength(1)
const report = testKit.reports()[0]
expect(report).toHaveProperty(...)
testkit.puppeteer.stopListening(page);
You may see more usage examples in the testing section of this repository as well.
See full API description and documentation here: https://wix.github.io/sentry-testkit/
Of Course!
sentry-testkit
have full support in both @sentry/browser
and @sentry/node
since they have the same API and lifecycle under the hood.
The good old legacy raven-testkit
documentation can be found here. It it still there to serve Raven
which is the old legacy SDK of Sentry for JavaScript/Node.js platforms
sentry-testkit
relies on express
and http
packages from NodeJS. We have separated entry sentry-testkit/browser
where we not include any NodeJS-related code.
const sentryTestkit = require('sentry-testkit/browser');
const {testkit} = sentryTestkit()
// Your code for browser