web-dev-qa-db-fra.com

Erreurs typographiques lors de l'utilisation de moqueries

J'ai un fichier .js Créé précédemment qui masque certaines de nos fonctions à des fins de test jest. Je migre cela vers un fichier .ts:

Server.ts

const Server = jest.genMockFromModule('../Server');

Server.getAsync = Server.default.getAsync;
// other REST-ful functions here

export default Server;

Je reçois les erreurs suivantes:

La propriété 'getAsync' n'existe pas sur le type '{}'

La propriété 'default' n'existe pas sur le type '{}'

Ensuite, dans un fichier de test correspondant:

MyComponent.test.ts

import Server from 'path/to/Server';

jest.mock('path/to/Server');

const dispatchMock = jest.fn();
const getStateMock = jest.fn();

describe('MyComponent.someFunction', () => {
    beforeEach(() => {
        jest.resetAllMocks();
    });

    it('Does the right stuff', () => {
        Server.getAsync.mockReturnValueOnce(Promise.resolve([{ key: 'value' }]));
        dispatchMock.mockImplementationOnce((promise) => promise);
        dispatchMock.mockImplementationOnce();

        return someFunction()(dispatchMock)
            .then(() => {
                expect(Server.getAsync).toHaveBeenCalledTimes(1);
                expect(Server.getAsync.mock.calls[0][0]).toBe('something');
            });
    });
});

Je reçois des erreurs sur dispatchMock.mockImplementationOnce()

1 argument attendu, mais obtenu 0. (méthode) jest.MockInstance <{}>. MockImplementationOnce (fn: (... args: any []) => any): jest.Mock <{}>

... sur Server.getAsync.mockReturnValueOnce

La propriété 'mockReturnValueOnce' n'existe pas sur le type '(url: string, baseRoute ?: string | null, loadingGenerator ?: (isLoading: boolean) => {type: strin ...'.

... et sur Server.getAsync.mock

La propriété 'mock' n'existe pas sur le type '(url: string, baseRoute ?: string | null, loadingGenerator ?: (isLoading: boolean) => {type: strin ...'.

Cela fait un moment que je me tape la tête et toute aide serait grandement appréciée.

MISE À JOUR

D'accord, j'ai ajouté as any À la fin de la première ligne de mon fichier Server.ts Alors maintenant il ressemble à ceci:

const Server = jest.genMockFromModule('../Server') as any;

Cela s'est débarrassé de la première série d'erreurs. Toujours confronté aux erreurs de mon fichier .test.ts.

MISE À JOUR 2

J'ai remarqué que lorsque j'exécute les tests de plaisanterie, ils réussissent tous même s'il existe des TypeErrors. Ces problèmes ne semblent pas liés aux tests réels.

7
noblerare

J'ai corrigé cela moi-même. La façon dont je l'ai fait fonctionner était de lancer des appels à Server.getAsync au type de simulation de plaisanterie spécifique.

let getAsyncMock = Server.getAsync as jest.Mock

ou

let getAsyncMock = <jest.Mock>(Server.getAsync)

Cela supprime mes erreurs.

20
noblerare

Pour remplacer une importation, vous pouvez le faire comme suit:

import { AnalyticsApi } from "../../api/src";

jest.mock("../../api/src");

let listPolicies = jest.fn(() => {
  return Promise.resolve();
});

(AnalyticsApi as jest.Mock<AnalyticsApi>).mockImplementation(() => ({
  listPolicies,
}));
2
Sean Lafferty

Après la réponse de @nobleare ... une bonne mise à jour consistera à encapsuler votre implémentation fictive dans le beforeAll et à l'effacer dans le bloc beforeEach:

import { AnalyticsApi } from "../../api/src";

jest.mock("../../api/src");

describe('...', () => {

  beforeAll(() => {
    (AnalyticsApi as jest.Mock<AnalyticsApi>).mockImplementation(() => ({
      listPolicies: jest.fn().mockResolvedValue('promiseValue')
    }));
  });

  beforeEach(() => {
    (AnalyticsApi as jest.Mock<AnalyticsApi>).mockClear();
  });

});
2
iarroyo

Tout d'abord, vous utilisez genMockFromModule qui crée une maquette de votre Server donc il n'est pas nécessaire d'appeler jest.mock('path/to/Server');.

Deuxièmement, qu'essayez-vous de réaliser en faisant Server.getAsync = Server.default.getAsync;? Il suffit de déplacer le getAsync d'un niveau qui n'est pas nécessaire. Vous pouvez simplement appeler jest.genMockFromModule('../Server').default;;

dispatchMock.mockImplementationOnce() lance cette erreur parce que vous avez dit qu'il fallait lui passer une promesse ici: dispatchMock.mockImplementationOnce((promise) => promise);

Pour Server.getAsync.mockReturnValueOnce Et Server.getAsync.mock, Vous voulez réellement utiliser mocked au lieu de transtyper le type comme le suggèrent les autres réponses.

Exemple: mocked(Server.getAsync).mockReturnValueOnce()

0
ChristopherStrydom