En février 2017, ils ont fusionné un PR en ajoutant cette fonctionnalité, ils ont publié en avril 2017.
donc pour espionner les getters / setters que vous utilisez:
const spy = spyOnProperty(myObj, 'myGetterName', 'get');
où myObj est votre instance, 'myGetterName' est le nom de celui défini dans votre classe as get myGetterName() {}
et le troisième paramètre est le type get
ou set
.
Vous pouvez utiliser les mêmes affirmations que vous utilisez déjà avec les espions créés avec spyOn
.
Ainsi, vous pouvez par exemple:
const spy = spyOnProperty(myObj, 'myGetterName', 'get'); // to stub and return nothing. Just spy and stub.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.returnValue(1); // to stub and return 1 or any value as needed.
const spy = spyOnProperty(myObj, 'myGetterName', 'get').and.callThrough(); // Call the real thing.
Voici la ligne du code source github où cette méthode est disponible si vous êtes intéressé.
https://github.com/jasmine/jasmine/blob/7f8f2b5e7a7af70d7f6b629331eb6fe0a7cb9279/src/core/requireInterface.js#L199
En répondant à la question initiale, avec jasmine 2.6.1, vous:
const spy = spyOnProperty(myObj, 'valueA', 'get').andReturn(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
valueA
est unObservable
ouSubject
? Je reçoisProperty valueA does not have access type get
Une raison pour laquelle vous ne pouvez pas simplement le modifier directement sur l'objet? Ce n'est pas comme si javascript imposait la visibilité d'une propriété sur un objet.
la source
spyOn
indique explicitement que je veux moquer quelque chose, alors que je définis directement la propriété indique implicitement que je veux moquer quelque chose, et je ne suis pas sûr que quelqu'un d'autre comprendra que je me moque de quelque chose quand il lit le code. Un autre cas est que je ne veux pas changer le comportement interne de l'objet, par exemple si je change la propriété de longueur pour un tableau, le tableau est coupé, donc une maquette sera meilleurespyOn
.spyOn
échoue au test si la propriété n'existe pas.TypeError: Cannot assign to read only property 'sessionStorage' of object '#<Window>'
Jasmine n'a pas cette fonctionnalité, mais vous pourrez peut-être pirater quelque chose ensemble en utilisant
Object.defineProperty
.Vous pouvez refactoriser votre code pour utiliser une fonction getter, puis espionner le getter.
la source
and.returnValue(1)
Le meilleur moyen est d'utiliser
spyOnProperty
. Il attend 3 paramètres et vous devez passerget
ouset
comme troisième paramètre .Exemple
Ici , je suis en train de l'
get
declientWidth
d'div.nativeElement
objet.la source
Si vous utilisez ES6 (Babel) ou TypeScript, vous pouvez extraire la propriété à l'aide des accesseurs get et set
Ensuite, dans votre test, vous pouvez vérifier que la propriété est définie avec:
la source
La bonne façon de faire est avec la propriété d'espionnage, elle vous permettra de simuler une propriété sur un objet avec une valeur spécifique.
la source
Supposons qu'il existe une méthode comme celle-ci qui doit être testée La
src
propriété de la petite image doit être vérifiéeLe spyOn () ci-dessous fait que la "nouvelle image" reçoit le faux code du test le code spyOn renvoie un objet qui n'a qu'une propriété src
Comme la variable "hook" est censée être visible dans le faux code dans SpyOn et aussi plus tard après l'appel de "reportABCEvent"
Ceci est pour jasmine 1.3 mais pourrait fonctionner sur 2.0 si le "andCallFake" est modifié pour le nom 2.0
la source
J'utilise une grille de kendo et je ne peux donc pas changer l'implémentation en une méthode getter mais je veux tester autour de cela (se moquer de la grille) et ne pas tester la grille elle-même. J'utilisais un objet espion mais cela ne prend pas en charge la moquerie de propriété, alors je fais ceci:
C'est un peu long mais ça marche un régal
la source
Je suis un peu en retard à la fête ici je sais mais,
Vous pouvez accéder directement à l'objet des appels, qui peut vous donner les variables pour chaque appel
la source
Vous ne pouvez pas simuler une variable, mais vous pouvez créer une fonction getter pour elle et simuler cette méthode dans votre fichier de spécifications.
la source