Réponses:
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é.
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();
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.
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 meilleure
spyOn
.
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.
spyOn(myObj, 'getValueA').andReturn(1);
expect(myObj.getValueA()).toBe(1);
and.returnValue(1)
Le meilleur moyen est d'utiliser spyOnProperty
. Il attend 3 paramètres et vous devez passer get
ou set
comme troisième paramètre .
const div = fixture.debugElement.query(By.css('.ellipsis-overflow'));
// now mock properties
spyOnProperty(div.nativeElement, 'clientWidth', 'get').and.returnValue(1400);
spyOnProperty(div.nativeElement, 'scrollWidth', 'get').and.returnValue(2400);
Ici , je suis en train de l' get
de clientWidth
d' div.nativeElement
objet.
Si vous utilisez ES6 (Babel) ou TypeScript, vous pouvez extraire la propriété à l'aide des accesseurs get et set
export class SomeClassStub {
getValueA = jasmine.createSpy('getValueA');
setValueA = jasmine.createSpy('setValueA');
get valueA() { return this.getValueA(); }
set valueA(value) { this.setValueA(value); }
}
Ensuite, dans votre test, vous pouvez vérifier que la propriété est définie avec:
stub.valueA = 'foo';
expect(stub.setValueA).toHaveBeenCalledWith('foo');
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.
const spy = spyOnProperty(myObj, 'valueA').and.returnValue(1);
expect(myObj.valueA).toBe(1);
expect(spy).toHaveBeenCalled();
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ée
function reportABCEvent(cat, type, val) {
var i1 = new Image(1, 1);
var link = getABC('creosote');
link += "&category=" + String(cat);
link += "&event_type=" + String(type);
link += "&event_value=" + String(val);
i1.src = link;
}
Le 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"
describe("Alphabetic.ads", function() {
it("ABC events create an image request", function() {
var hook={};
spyOn(window, 'Image').andCallFake( function(x,y) {
hook={ src: {} }
return hook;
}
);
reportABCEvent('testa', 'testb', 'testc');
expect(hook.src).
toEqual('[zubzub]&arg1=testa&arg2=testb&event_value=testc');
});
Ceci est pour jasmine 1.3 mais pourrait fonctionner sur 2.0 si le "andCallFake" est modifié pour le nom 2.0
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:
this.$scope.ticketsGrid = {
showColumn: jasmine.createSpy('showColumn'),
hideColumn: jasmine.createSpy('hideColumn'),
select: jasmine.createSpy('select'),
dataItem: jasmine.createSpy('dataItem'),
_data: []
}
C'est un peu long mais ça marche un régal
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
expect(spy.calls.argsFor(0)[0].value).toBe(expectedValue)
valueA
est unObservable
ouSubject
? Je reçoisProperty valueA does not have access type get