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.
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.
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,
}));
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();
});
});
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()