web-dev-qa-db-fra.com

Fausse dépendance en plaisanterie avec le manuscrit

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!

28
Philip Chmalts

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.

Voici quelques autres modèles utiles que j'ai trouvés au cours de mon travail avec Jest et TS.

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

44
Artur Górski

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");
9
adanilev