Lors du test d'un module qui a une dépendance dans un fichier différent. Lors de l'affectation de ce module à jest.Mock
TypeScript signale une erreur indiquant que la méthode mockReturnThisOnce
(ou toute autre méthode jest.Mock) n’existe pas sur la dépendance, car elle a déjà été typée. Quel est le moyen approprié de faire en sorte que TypeScript hérite des types de jest.Mock?
Voici un exemple rapide.
Dépendance
const myDep = (name: string) => name;
export default myDep;
test.ts
import * as dep from '../depenendency';
jest.mock('../dependency');
it('should do what I need', () => {
//this throws ts error
// Property mockReturnValueOnce does not exist on type (name: string)....
dep.default.mockReturnValueOnce('return')
}
Je pense que c'est un cas d'utilisation très courant et que je ne sais pas comment taper correctement. Toute aide serait très appréciée!
Vous pouvez utiliser le transtypage et votre test.ts
Devrait ressembler à ceci:
import * as dep from '../dependency';
jest.mock('../dependency');
const mockedDependency = <jest.Mock<typeof dep.default>>dep.default;
it('should do what I need', () => {
//this throws ts error
// Property mockReturnValueOnce does not exist on type (name: string)....
mockedDependency.mockReturnValueOnce('return');
});
TS transpiler n'est pas conscient que jest.mock('../dependency');
change le type de dep
et vous devez donc utiliser le transtypage. Comme importé dep
n'est pas une définition de type, vous devez obtenir son type avec typeof dep.default
.
Lorsque l'élément importé est une classe, vous n'avez pas à utiliser typeof par exemple:
import { SomeClass } from './SomeClass';
jest.mock('./SomeClass');
const mockedClass = <jest.Mock<SomeClass>>SomeClass;
Cette solution est également utile lorsque vous devez vous moquer de certains modules natifs de nœud:
import { existsSync } from 'fs';
jest.mock('fs');
const mockedExistsSync = <jest.Mock<typeof existsSync>>existsSync;
Au cas où vous ne voudriez pas utiliser la simulation automatique Jest et préféreriez en créer une manuellement
import TestedClass from './TestedClass';
import TestedClassDependency from './TestedClassDependency';
const testedClassDependencyMock = jest.fn<TestedClassDependency>(() => ({
// implementation
}));
it('Should throw an error when calling playSomethingCool', () => {
const testedClass = new TestedClass(testedClassDependencyMock());
});
testedClassDependencyMock()
crée une instance d'objet simulé TestedClassDependency
peut être une classe ou un type ou une interface
J'utilise le modèle de @ types/jest/index.d.ts juste au-dessus du type def pour Mocked (ligne 515):
import { Api } from "../api";
jest.mock("../api");
const myApi: jest.Mocked<Api> = new Api() as any;
myApi.myApiMethod.mockImplementation(() => "test");