Jest Mock Slack Web Client
This package contains a type-safe mock of @slack/web-api
. @slack-wrench/jest-mock-web-client
allows you to easily mock your calls to Slack's api and allows you to return a fake response. This means you get all the power of jest.fn()
with maintainable and predictable test cases.
Table of Contents
Install
yarn add --dev @slack-wrench/jest-mock-web-client
# or
npm install --save-dev @slack-wrench/jest-mock-web-client
Usage
This mock is intended to be used as a manual mock.
Create a file for the web-api manual mock (__mocks__/@slack/web-api.js
)
// __mocks__/@slack/web-api.js
const mockWebApi = require('@slack-wrench/jest-mock-web-client');
module.exports = mockWebApi(jest);
Test your code how you would expect:
// src/bot.spec.js
const { WebClient } = require('@slack/web-api');
const Bot = require('./bot');
describe('The Bot', () => {
let bot;
let client;
beforeEach(() => {
// Reset mocks for each test
WebClient.clearMocks();
// In this example, bot creates a `new WebClient()`
bot = new Bot();
client = WebClient.mock.instances[0];
});
it('Can say things', async () => {
const message = 'Mocking Slack is easy!';
// With the mock setup, this won't actually call to Slack's servers
await bot.say(message);
expect(client.chat.postMessage).toHaveBeenCalledWith(
expect.objectContaining({
text: message,
}),
);
});
});
Getting the mocked client
Mocked instances are exposed as jest automatic mocks. You can find created instances at WebClient.mock.instances
.
Mocking responses
By default, all methods resolve with { ok: true }
. If you want to change that, every function is a jest mock function so you can call things like mockResolvedValue
.
client.chat.postMessage.mockResolvedValue({
ok: false,
error: 'too_many_attachments',
});
// In this example, say will throw an error if Slack's response isn't ok
expect(bot.say('This will error')).rejects.toEqual({
error: 'Oops, Something happened',
});
Typescript
For proper typings, you must setup your tests a little differently. We use typescript, so you can always refer to our tests, but here's an example.
import {
MockedWebClient,
MockWebClient,
} from '@slack-wrench/jest-mock-web-client';
import Bot from './bot';
describe('Your App', () => {
let bot: Bot;
let client: MockWebClient; // Notice this typing instead of `WebClient`
beforeEach(() => {
// We need to use `MockedWebClient` instead of `WebClient` for proper typings
MockedWebClient.mockClear();
bot = new Bot();
client = MockedWebClient.mock.instances[0];
});
});