L'objet Jest
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
L'objet jest est automatiquement disponible dans chaque fichier de test. Les méthodes de l'objet jest permettent de créer des mocks et de contrôler le comportement global de Jest. Il peut aussi être importé explicitement via import {jest} from '@jest/globals'.
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
Les exemples TypeScript de cette page ne fonctionneront comme documenté que si vous importez explicitement les API Jest :
import {expect, jest, test} from '@jest/globals';
Consultez le guide Premiers pas pour plus de détails sur la configuration de Jest avec TypeScript.
Méthodes
- Modules Mock
jest.disableAutomock()jest.enableAutomock()jest.createMockFromModule(moduleName)jest.mock(moduleName, factory, options)jest.Mocked<Source>jest.mocked(source, options?)jest.unmock(moduleName)jest.deepUnmock(moduleName)jest.doMock(moduleName, factory, options)jest.dontMock(moduleName)jest.setMock(moduleName, moduleExports)jest.requireActual(moduleName)jest.requireMock(moduleName)jest.onGenerateMock(cb)jest.resetModules()jest.isolateModules(fn)jest.isolateModulesAsync(fn)
- Fonctions Mock
- Horloges fictives
jest.useFakeTimers(fakeTimersConfig?)jest.useRealTimers()jest.runAllTicks()jest.runAllTimers()jest.runAllTimersAsync()jest.runAllImmediates()jest.advanceTimersByTime(msToRun)jest.advanceTimersByTimeAsync(msToRun)jest.runOnlyPendingTimers()jest.runOnlyPendingTimersAsync()jest.advanceTimersToNextTimer(steps)jest.advanceTimersToNextTimerAsync(steps)jest.advanceTimersToNextFrame()jest.clearAllTimers()jest.getTimerCount()jest.now()jest.setSystemTime(now?: number | Date)jest.setTimerTickMode(mode)jest.getRealSystemTime()
- Divers
Modules Mock
jest.disableAutomock()
Désactive le mock automatique dans le chargeur de modules.
Le mock automatique doit être activé via l'option de configuration automock pour que cette méthode soit efficace. Consultez aussi la documentation de cette option pour plus de détails.
- JavaScript
- TypeScript
/** @type {import('jest').Config} */
const config = {
automock: true,
};
module.exports = config;
import type {Config} from 'jest';
const config: Config = {
automock: true,
};
export default config;
Après l'appel à disableAutomock(), tous les require() renverront les versions réelles des modules (plutôt que des versions mockées).
export default {
authorize: () => {
return 'token';
},
};
import utils from '../utils';
jest.disableAutomock();
test('original implementation', () => {
// now we have the original implementation,
// even if we set the automocking in a jest configuration
expect(utils.authorize()).toBe('token');
});
C'est particulièrement utile quand le nombre de dépendances à mocker est bien inférieur à celles qu'on ne veut pas mocker. Par exemple, lorsque vous testez un module utilisant de nombreuses dépendances considérées comme des "détails d'implémentation", vous ne voudrez probablement pas les mocker.
Les dépendances typiquement considérées comme "détails d'implémentation" incluent : éléments natifs du langage (ex. méthodes d'Array.prototype), utilitaires courants (ex. underscore, lodash, fonctions de manipulation de tableaux), ou bibliothèques complètes comme React.js.
Retourne l'objet jest pour le chaînage.
Avec babel-jest, les appels à disableAutomock() sont automatiquement remontés en haut du bloc de code. Utilisez autoMockOff() pour éviter explicitement ce comportement.
jest.enableAutomock()
Active le mock automatique dans le chargeur de modules.
Pour plus de détails sur le mock automatique, consultez la documentation de l'option automock.
Exemple :
export default {
authorize: () => {
return 'token';
},
isAuthorized: secret => secret === 'wizard',
};
jest.enableAutomock();
import utils from '../utils';
test('original implementation', () => {
// now we have the mocked implementation,
expect(utils.authorize._isMockFunction).toBeTruthy();
expect(utils.isAuthorized._isMockFunction).toBeTruthy();
});
Retourne l'objet jest pour le chaînage.
Avec babel-jest, les appels à enableAutomock sont automatiquement remontés en haut du bloc de code. Utilisez autoMockOn pour éviter explicitement ce comportement.
jest.createMockFromModule(moduleName)
Génère une version mockée d'un module via le système de mock automatique.
Utile pour créer un mock manuel étendant le comportement du mock automatique :
- JavaScript
- TypeScript
module.exports = {
authorize: () => {
return 'token';
},
isAuthorized: secret => secret === 'wizard',
};
const utils = jest.createMockFromModule('../utils');
utils.isAuthorized = jest.fn(secret => secret === 'not wizard');
test('implementation created by jest.createMockFromModule', () => {
expect(jest.isMockFunction(utils.authorize)).toBe(true);
expect(utils.isAuthorized('not wizard')).toBe(true);
});
export const utils = {
authorize: () => {
return 'token';
},
isAuthorized: (secret: string) => secret === 'wizard',
};
const {utils} =
jest.createMockFromModule<typeof import('../utils')>('../utils');
utils.isAuthorized = jest.fn((secret: string) => secret === 'not wizard');
test('implementation created by jest.createMockFromModule', () => {
expect(jest.isMockFunction(utils.authorize)).toBe(true);
expect(utils.isAuthorized('not wizard')).toBe(true);
});
Voici comment createMockFromModule mocke les types de données :
Function
Crée une nouvelle fonction mock sans paramètres qui renvoie undefined. S'applique aussi aux fonctions async.
Class
Crée une nouvelle classe conservant l'interface d'origine, avec toutes ses méthodes et propriétés mockées.
Object
Crée un nouvel objet cloné en profondeur : les clés sont conservées, les valeurs mockées.
Array
Crée un nouveau tableau vide, ignorant l'original.
Primitives
Crée une nouvelle propriété avec la valeur primitive d'origine.
Exemple :
module.exports = {
function: function square(a, b) {
return a * b;
},
asyncFunction: async function asyncSquare(a, b) {
const result = (await a) * b;
return result;
},
class: new (class Bar {
constructor() {
this.array = [1, 2, 3];
}
foo() {}
})(),
object: {
baz: 'foo',
bar: {
fiz: 1,
buzz: [1, 2, 3],
},
},
array: [1, 2, 3],
number: 123,
string: 'baz',
boolean: true,
symbol: Symbol.for('a.b.c'),
};
const example = jest.createMockFromModule('../example');
test('should run example code', () => {
// creates a new mocked function with no formal arguments.
expect(example.function.name).toBe('square');
expect(example.function).toHaveLength(0);
// async functions get the same treatment as standard synchronous functions.
expect(example.asyncFunction.name).toBe('asyncSquare');
expect(example.asyncFunction).toHaveLength(0);
// creates a new class with the same interface, member functions and properties are mocked.
expect(example.class.constructor.name).toBe('Bar');
expect(example.class.foo.name).toBe('foo');
expect(example.class.array).toHaveLength(0);
// creates a deeply cloned version of the original object.
expect(example.object).toEqual({
baz: 'foo',
bar: {
fiz: 1,
buzz: [],
},
});
// creates a new empty array, ignoring the original array.
expect(example.array).toHaveLength(0);
// creates a new property with the same primitive value as the original property.
expect(example.number).toBe(123);
expect(example.string).toBe('baz');
expect(example.boolean).toBe(true);
expect(example.symbol).toEqual(Symbol.for('a.b.c'));
});
jest.mock(moduleName, factory, options)
Simule un module avec une version automockée lorsqu'il est importé. Les paramètres factory et options sont optionnels. Par exemple :
module.exports = () => 'banana';
jest.mock('../banana');
const banana = require('../banana'); // banana will be explicitly mocked.
banana(); // will return 'undefined' because the function is auto-mocked.
Le second argument permet de spécifier une fabrique de module explicite qui sera exécutée à la place de la fonctionnalité d'auto-simulation de Jest :
- JavaScript
- TypeScript
jest.mock('../moduleName', () => {
return jest.fn(() => 42);
});
// This runs the function specified as second argument to `jest.mock`.
const moduleName = require('../moduleName');
moduleName(); // Will return '42';
// The optional type argument provides typings for the module factory
jest.mock<typeof import('../moduleName')>('../moduleName', () => {
return jest.fn(() => 42);
});
// This runs the function specified as second argument to `jest.mock`.
const moduleName = require('../moduleName');
moduleName(); // Will return '42';
Lorsqu'on utilise le paramètre factory pour un module ES6 avec un export par défaut, la propriété __esModule: true doit être spécifiée. Cette propriété est normalement générée par Babel/TypeScript, mais doit être définie manuellement ici. Lors de l'importation d'un export par défaut, cela indique d'importer la propriété nommée default de l'objet exporté :
import moduleName, {foo} from '../moduleName';
jest.mock('../moduleName', () => {
return {
__esModule: true,
default: jest.fn(() => 42),
foo: jest.fn(() => 43),
};
});
moduleName(); // Will return 42
foo(); // Will return 43
Le troisième argument permet de créer des simulations virtuelles – des mocks de modules qui n'existent nulle part dans le système :
jest.mock(
'../moduleName',
() => {
/*
* Custom implementation of a module that doesn't exist in JS,
* like a generated module or a native module in react-native.
*/
},
{virtual: true},
);
L'importation d'un module dans un fichier de configuration (spécifié par setupFilesAfterEnv) empêchera la simulation de ce module ainsi que de tous les modules qu'il importe.
Les modules simulés avec jest.mock sont mockés uniquement pour le fichier appelant jest.mock. Un autre fichier important le module récupérera l'implémentation originale même s'il s'exécute après le fichier de test simulant le module.
Retourne l'objet jest pour le chaînage.
Vous écrivez des tests en TypeScript ? Utilisez le type utilitaire jest.Mocked ou la méthode d'aide jest.mocked() pour typer vos modules simulés.
jest.Mocked<Source>
Voir le chapitre Utilisation avec TypeScript de la page sur les fonctions mockées pour la documentation.
jest.mocked(source, options?)
Voir le chapitre Utilisation avec TypeScript de la page sur les fonctions mockées pour la documentation.
jest.unmock(moduleName)
Indique que le système de modules ne doit jamais retourner une version simulée du module spécifié depuis require() (c'est-à-dire qu'il doit toujours retourner le module réel).
L'usage principal de cette API est de spécifier le module qu'un test donné veut tester (et qu'il ne souhaite donc pas voir automocké).
Retourne l'objet jest pour le chaînage.
jest.deepUnmock(moduleName)
Indique que le système de modules ne doit jamais retourner une version simulée du module spécifié et de ses dépendances.
Retourne l'objet jest pour le chaînage.
jest.doMock(moduleName, factory, options)
Avec babel-jest, les appels à mock sont automatiquement remontés en haut du bloc de code. Utilisez cette méthode si vous voulez explicitement éviter ce comportement.
Un exemple où cela est utile est lorsque vous souhaitez simuler différemment un module dans le même fichier :
- JavaScript
- TypeScript
beforeEach(() => {
jest.resetModules();
});
test('moduleName 1', () => {
jest.doMock('../moduleName', () => {
return jest.fn(() => 1);
});
const moduleName = require('../moduleName');
expect(moduleName()).toBe(1);
});
test('moduleName 2', () => {
jest.doMock('../moduleName', () => {
return jest.fn(() => 2);
});
const moduleName = require('../moduleName');
expect(moduleName()).toBe(2);
});
beforeEach(() => {
jest.resetModules();
});
test('moduleName 1', () => {
// The optional type argument provides typings for the module factory
jest.doMock<typeof import('../moduleName')>('../moduleName', () => {
return jest.fn(() => 1);
});
const moduleName = require('../moduleName');
expect(moduleName()).toBe(1);
});
test('moduleName 2', () => {
jest.doMock<typeof import('../moduleName')>('../moduleName', () => {
return jest.fn(() => 2);
});
const moduleName = require('../moduleName');
expect(moduleName()).toBe(2);
});
L'utilisation de jest.doMock() avec des imports ES6 nécessite des étapes supplémentaires. Suivez ces instructions si vous ne voulez pas utiliser require dans vos tests :
-
Nous devons spécifier la propriété
__esModule: true(voir l'APIjest.mock()pour plus d'informations). -
Les imports statiques de modules ES6 sont remontés en haut du fichier, nous devons donc les importer dynamiquement avec
import(). -
Enfin, nous avons besoin d'un environnement supportant l'importation dynamique. Consultez Utilisation de Babel pour la configuration initiale. Ajoutez ensuite le plugin babel-plugin-dynamic-import-node, ou un équivalent, à votre configuration Babel pour activer l'importation dynamique dans Node.
beforeEach(() => {
jest.resetModules();
});
test('moduleName 1', () => {
jest.doMock('../moduleName', () => {
return {
__esModule: true,
default: 'default1',
foo: 'foo1',
};
});
return import('../moduleName').then(moduleName => {
expect(moduleName.default).toBe('default1');
expect(moduleName.foo).toBe('foo1');
});
});
test('moduleName 2', () => {
jest.doMock('../moduleName', () => {
return {
__esModule: true,
default: 'default2',
foo: 'foo2',
};
});
return import('../moduleName').then(moduleName => {
expect(moduleName.default).toBe('default2');
expect(moduleName.foo).toBe('foo2');
});
});
Retourne l'objet jest pour le chaînage.
jest.dontMock(moduleName)
Lorsque vous utilisez babel-jest, les appels à unmock sont automatiquement remontés en haut du bloc de code. Utilisez cette méthode si vous souhaitez explicitement éviter ce comportement.
Retourne l'objet jest pour le chaînage.
jest.setMock(moduleName, moduleExports)
Fournit explicitement l'objet mock que le système de modules doit retourner pour le module spécifié.
Dans certains cas, le mock généré automatiquement par le système de modules ne convient pas à vos besoins de test. Normalement, dans ces situations, vous devriez créer un mock manuel plus adapté au module concerné. Cependant, dans de très rares occasions, même un mock manuel ne convient pas et vous devez construire le mock vous-même dans votre test.
Dans ces scénarios exceptionnels, vous pouvez utiliser cette API pour remplir manuellement l'emplacement correspondant dans le registre des mocks du système de modules.
Retourne l'objet jest pour le chaînage.
Il est recommandé d'utiliser jest.mock() à la place. Le deuxième argument de l'API jest.mock est une fabrique de module plutôt que l'objet module exporté attendu.
jest.requireActual(moduleName)
Renvoie le module réel au lieu d'un mock, contournant toutes les vérifications sur l'application d'une implémentation mockée au module.
- JavaScript
- TypeScript
jest.mock('../myModule', () => {
// Require the original module to not be mocked...
const originalModule = jest.requireActual('../myModule');
return {
__esModule: true, // Use it when dealing with esModules
...originalModule,
getRandom: jest.fn(() => 10),
};
});
const getRandom = require('../myModule').getRandom;
getRandom(); // Always returns 10
jest.mock('../myModule', () => {
// Require the original module to not be mocked...
const originalModule =
jest.requireActual<typeof import('../myModule')>('../myModule');
return {
__esModule: true, // Use it when dealing with esModules
...originalModule,
getRandom: jest.fn(() => 10),
};
});
const getRandom = require('../myModule').getRandom;
getRandom(); // Always returns 10
jest.requireMock(moduleName)
Renvoie un mock de module au lieu du module réel, contournant toutes les vérifications sur l'importation normale du module.
jest.onGenerateMock(cb)
Enregistre une fonction de rappel invoquée chaque fois que Jest génère un mock pour un module. Ce rappel vous permet de modifier le mock avant qu'il ne soit renvoyé au reste de vos tests.
Paramètres du rappel :
-
modulePath: string- Le chemin absolu vers le module en cours de mock. -
moduleMock: T- L'objet mock généré par Jest pour le module. Cet objet peut être modifié ou remplacé avant le retour.
Comportement :
-
Si plusieurs rappels sont enregistrés via des appels consécutifs à
onGenerateMock, ils seront invoqués dans l'ordre de leur ajout. -
Chaque rappel reçoit en entrée la sortie du rappel précédent comme
moduleMock. Cela permet d'appliquer plusieurs couches de transformations au même mock.
jest.onGenerateMock((modulePath, moduleMock) => {
// Inspect the module name and decide how to transform the mock
if (modulePath.includes('Database')) {
// For demonstration, let's replace a method with our own custom mock
moduleMock.connect = jest.fn().mockImplementation(() => {
console.log('Connected to mock DB');
});
}
// Return the (potentially modified) mock
return moduleMock;
});
// Apply mock for module
jest.mock('./Database');
// Later in your tests
import Database from './Database';
// The `Database` mock now has any transformations applied by our callback
Le rappel onGenerateMock n'est pas appelé pour les mocks créés manuellement, tels que :
- Les mocks définis dans un dossier
__mocks__ - Les fabriques explicites fournies via
jest.mock('moduleName', () => { ... })
jest.resetModules()
Réinitialise le registre des modules - le cache de tous les modules importés. Utile pour isoler des modules où un état local pourrait entrer en conflit entre les tests.
Exemple :
const sum1 = require('../sum');
jest.resetModules();
const sum2 = require('../sum');
sum1 === sum2;
// > false (Both sum modules are separate "instances" of the sum module.)
Exemple dans un test :
beforeEach(() => {
jest.resetModules();
});
test('works', () => {
const sum = require('../sum');
});
test('works too', () => {
const sum = require('../sum');
// sum is a different copy of the sum module from the previous test.
});
Retourne l'objet jest pour le chaînage.
jest.isolateModules(fn)
jest.isolateModules(fn) va plus loin que jest.resetModules() en créant un registre sandbox pour les modules chargés à l'intérieur de la fonction de rappel. Utile pour isoler des modules spécifiques à chaque test afin que leur état local n'entre pas en conflit.
let myModule;
jest.isolateModules(() => {
myModule = require('myModule');
});
const otherCopyOfMyModule = require('myModule');