Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(BSR) feat(Jest): add the possibility to create empty mocks from types #7265

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

xlecunff-pass
Copy link
Contributor

@xlecunff-pass xlecunff-pass commented Nov 22, 2024

L'un des principaux problèmes des mocks de test est qu'il faut souvent créer une fixture avec de la fausse donnée juste pour la structure.

Observation 1

Ils sont utilisés dans les tests de deux manières:

  • utilisés avec des spread operators pour mettre en évidence la donnée importante pour le test ce qui est une bonne pratique mais réduit la lisibilité
    const bookingWithoutDateUsed = {
      ...baseBooking,
      stock: {
        ...baseBooking.stock,
        offer: { ...baseBooking.stock.offer, subcategoryId: SubcategoryIdEnum.SEANCE_CINE },
      },
      dateUsed: null,
      userReaction: null,
    }
  • utilisés pour le test avec leur valeur non modifiée, ce qui est une mauvaise pratique car il faut se référer à la fixture et si sa donnée change les tests cassent
expect(fixture[0].id).toBe(1)

Pour une première conclusion, il faudrait faire en sorte que le test se suffise à lui même en terme de lisibilité, et ne soit pas dépendant de valeurs dans les fixtures

Observation 2

Sachant que le test ne doit pas se baser sur les valeurs écrites en dur dans les fixtures, les valeurs des fixtures deviennent inutiles
Le copier-coller de fixtures dans la codebase peut-être redondant et difficile à maintenir.

Il faudrait trouver un outil qui permette de créer un mock à partir d'un type, mais Typescript ne le permet pas directement.

Solution proposée

Le plugin ts-auto-mock le permet mais demande pas mal de config:

  • ts-jest doit être utilisé car babel-jest ne conserve pas le typage lors de la transpilation alors que cela est nécessaire pour ts-auto-mock afin de créer des objets à partir de types.
  • ts-patch doit être utilisé pour permettre au transformer ts-auto-mock d'effectuer correctement ses transformations

Exemple

import { createMock } from 'ts-auto-mock';

interface Person {
    id: string;
    name: string;
    details: {
        phone: number
    }
}

const mock = createMock<Person>({ name: "John" });
mock.id // ""
mock.name // "John"
mock.details // "{ phone: 0 }"

Limites

  • je ne connais pas les impacts de l'utilisation de ts-jest par rapport à babel-jest en terme de performances et d'efficacité

@xlecunff-pass xlecunff-pass force-pushed the bsr-create-mock branch 4 times, most recently from 2b7b1e2 to ef33c82 Compare November 22, 2024 14:42
Copy link

sonarcloud bot commented Nov 22, 2024

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant