web-dev-qa-db-fra.com

Les modules webpack 4 peuvent-ils être configurés pour permettre à Jasmine d'espionner leurs membres?

Je n'ai pas pu faire fonctionner ma suite de tests de jasmin avec webpack 4. Après la mise à niveau de webpack, j'obtiens l'erreur suivante pour presque tous les tests:

Error: <spyOn> : getField is not declared writable or has no setter 

Cela est dû à un modèle commun que nous utilisons pour créer des espions pour des fonctions simples:

import * as mod from 'my/module';
//...
const funcSpy = spyOn(mod, 'myFunc');

J'ai joué avec module.rules[].type mais aucune des options ne semble faire l'affaire.

Ce pack Web problème GH indique que les modules ECMA ne sont pas accessibles en écriture, ce qui est logique pour le Web, mais n'y a-t-il vraiment aucune solution de contournement pour les tests?

Versions de package pertinentes:

"jasmine-core": "2.6.4",
"TypeScript": "2.5.3",
"webpack": "4.1.1",
"webpack-cli": "^2.0.12",
"karma": "^0.13.22",
"karma-jasmine": "^1.1.0",
"karma-webpack": "^2.0.13",
17
Ryan

Il existe spyOnProperty qui permet de traiter une propriété en lecture seule en définissant l'argument accessType sur 'get'.

Votre configuration ressemblerait alors à

import * as mod from 'my/module';
//...
const funcSpy = jasmine.createSpy('myFunc').and.returnValue('myMockReturnValue');
spyOnProperty(mod, 'myFunc', 'get').and.returnValue(funcSpy);
16
Anton Poznyakovskiy

Ajout à la réponse de @Anton Poznyakovskiy:

J'ai ajouté cette fonction TypeScript à mon module de test partagé pour plus de commodité:

export const spyOnFunction = <T>(obj: T, func: keyof T) => {
  const spy = jasmine.createSpy(func as string);
  spyOnProperty(obj, func, 'get').and.returnValue(spy);

  return spy;
};

Exemple d'utilisation:

import * as mod from 'my/module';
//...
spyOnFunction(mod, 'myFunc').and.returnValue('myMockReturnValue');
4
Tom Faltesek

Il y a ce problème GitHub où ils arrivent à la même conclusion; que les exportations immuables sont destinées. Mais l'utilisateur lavelle a une solution de contournement (dans ce commentaire ) où ils ont créé différentes configurations de webpack pour le code de test et de production. La configuration de test utilise "commonjs" modules, qui semble avoir fonctionné pour eux en ne créant pas de getters.

1
Cem Schemel