An Async Example
În primul rând, activează suportul Babel în Jest după documentația din ghidul Noţiuni de bază.
Let's implement a module that fetches user data from an API and returns the user name.
// user.js
import request from './request';
export function getUserName(userID) {
return request('/users/' + userID).then(user => user.name);
}
In the above implementation, we expect the request.js
module to return a promise. We chain a call to then
to receive the user name.
Now imagine an implementation of request.js
that goes to the network and fetches some user data:
// request.js
const http = require('http');
export default function request(url) {
return new Promise(resolve => {
// This is an example of an http request, for example to fetch
// user data from an API.
// This module is being mocked in __mocks__/request.js
http.get({path: url}, response => {
let data = '';
response.on('data', _data => (data += _data));
response.on('end', () => resolve(data));
});
});
}
Because we don't want to go to the network in our test, we are going to create a manual mock for our request.js
module in the __mocks__
folder (the folder is case-sensitive, __MOCKS__
will not work). Acesta ar putea arăta în felul următor:
// __mocks__/request.js
const users = {
4: {name: 'Mark'},
5: {name: 'Paul'},
};
export default function request(url) {
return new Promise((resolve, reject) => {
const userID = parseInt(url.substr('/users/'.length), 10);
process.nextTick(() =>
users[userID]
? resolve(users[userID])
: reject({
error: 'User with ' + userID + ' not found.',
}),
);
});
}
Acum haideți sa scriem un test pentru funcţionalitatea noastră asincronă.
// __tests__/user-test.js
jest.mock('../request');
import * as user from '../user';
// The assertion for a promise must be returned.
it('works with promises', () => {
expect.assertions(1);
return user.getUserName(4).then(data => expect(data).toEqual('Mark'));
});
Apelăm jest.mock('.. /request')
să-i spunem lui Jest să folosească mock-ul nostru creat manual. Se aşteaptă ca valoarea returnată să fie o promisiune care urmează să fie rezolvată. You can chain as many Promises as you like and call expect
at any time, as long as you return a Promise at the end.
.resolves
Există și un mod mai concis folosind resolves
pentru desfacerea valorii unei promisiuni rezolvate împreună cu orice alt validator. În cazul în care promisiunea este respinsă, aserțiunea va eşua.
it('works with resolves', () => {
expect.assertions(1);
return expect(user.getUserName(5)).resolves.toEqual('Paul');
});
async
/await
Writing tests using the async
/await
syntax is also possible. Here is how you'd write the same examples from before:
// async/await can be used.
it('works with async/await', async () => {
expect.assertions(1);
const data = await user.getUserName(4);
expect(data).toEqual('Mark');
});
// async/await can also be used with `.resolves`.
it('works with async/await and resolves', async () => {
expect.assertions(1);
await expect(user.getUserName(5)).resolves.toEqual('Paul');
});
To enable async/await in your project, install @babel/preset-env
and enable the feature in your babel.config.js
file.
Tratarea erorilor
Erorile pot fi tratate prin metoda .catch
. Asiguraţi-vă că utilizați expect.assertions
pentru a verifica că un anumit număr de aserțiuni sunt executate. Altfel o promisiune rezolvată nu ar eşua testul:
// Testing for async errors using Promise.catch.
it('tests error with promises', () => {
expect.assertions(1);
return user.getUserName(2).catch(e =>
expect(e).toEqual({
error: 'User with 2 not found.',
}),
);
});
// Or using async/await.
it('tests error with async/await', async () => {
expect.assertions(1);
try {
await user.getUserName(1);
} catch (e) {
expect(e).toEqual({
error: 'User with 1 not found.',
});
}
});
.rejects
The.rejects
helper works like the .resolves
helper. În cazul în care promisiunea este îndeplinită, testul va eşua automat. expect.assertions(number)
is not required but recommended to verify that a certain number of assertions are called during a test. It is otherwise easy to forget to return
/await
the .resolves
assertions.
// Testing for async errors using `.rejects`.
it('tests error with rejects', () => {
expect.assertions(1);
return expect(user.getUserName(3)).rejects.toEqual({
error: 'User with 3 not found.',
});
});
// Or using async/await with `.rejects`.
it('tests error with async/await and rejects', async () => {
expect.assertions(1);
await expect(user.getUserName(3)).rejects.toEqual({
error: 'User with 3 not found.',
});
});
The code for this example is available at examples/async.
If you'd like to test timers, like setTimeout
, take a look at the Timer mocks documentation.