118 votes

en utilisant Jasmines spyon sur une méthode privée

Est-il possible d'utiliser la méthode spyon du cadre de test unitaire Jasmine sur les méthodes privées d'une classe ?

La documentation donne cet exemple mais cela peut-il être flexible pour une fonction privée ?

describe("Person", function() {
    it("calls the sayHello() function", function() {
        var fakePerson = new Person();
        spyOn(fakePerson, "sayHello");
        fakePerson.helloSomeone("world");
        expect(fakePerson.sayHello).toHaveBeenCalled();
    });
});

198voto

Luillyfe Jade Points 33

Il suffit d'ajouter un paramètre générique < tout> à la spyon() fonction :

 spyOn<any>(fakePerson, 'sayHello');

Il fonctionne parfaitement !

35voto

omer Points 597
spyOn<any>(fakePerson, 'sayHello');
expect(fakePerson['sayHello']).toHaveBeenCalled();

en ajoutant <any> à spyOn vous le retirez de la vérification du type de texte. Vous devez également utiliser la notation de l'index du tableau pour accéder à une méthode privée (sayHello) dans le test.

18voto

A-Sharabiani Points 5287

Disons que sayHello(text: string) est une méthode privée. Vous pouvez utiliser le code suivant :

// Create a spy on it using "any"
spyOn<any>(fakePerson, 'sayHello').and.callThrough();

// To access the private (or protected) method use [ ] operator:
expect(fakeperson['sayHello']).toHaveBeenCalledWith('your-params-to-sayhello');
  • Créer un espion sur la méthode privée en utilisant any .
  • Pour accéder à la méthode privée (ou protégée), utilisez [] opérateur.

9voto

jurl Points 646

Si vous utilisez Typescript pour vos objets, la fonction n'est pas vraiment privée.
Tout ce dont vous avez besoin, c'est de sauvegarder la valeur renvoyée par la commande spyOn puis interroger son calls propriété.

A la fin, ce code devrait fonctionner correctement pour vous (en tout cas, il a fonctionné pour moi) :

describe("Person", function() {
    it("calls the sayHello() function", function() {
        var fakePerson = new Person();
        // save the return value:
        var spiedFunction = spyOn<any>(fakePerson, "sayHello");
        fakePerson.helloSomeone("world");
        // query the calls property:
        expect(spiedFunction.calls.any()).toBeFalsy();
    });
});

4voto

user3765649 Points 16

Dans mon cas (Typescript) :

jest.spyOn<any, string>(authService, 'isTokenActual')

OU avec un résultat simulé :

jest.spyOn<any, string>(authService, 'isTokenActual').mockImplementation(() => {
  return false;
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X