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",
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);
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');
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.