web-dev-qa-db-fra.com

en utilisant Jasmine Spyon sur une méthode privée

est-il possible d'utiliser la méthode spyon du framework de test unitaire Jasmine sur des méthodes privées de classes?

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();
    });
});

Merci d'avance

23
user502014

Ajoutez simplement un paramètre générique <any> à la fonction spyon () :

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

Cela fonctionne parfaitement!

47
Luillyfe

si vous utilisez TypeScript pour vos objets, la fonction n'est pas vraiment privée.
Tout ce dont vous avez besoin est d’enregistrer la valeur renvoyée par l’appel spyOn, puis interrogez sa propriété calls.

À la fin, ce code devrait fonctionner correctement pour vous (du moins, 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(fakePerson, "sayHello");
        fakePerson.helloSomeone("world");
        // query the calls property:
        expect(spiedFunction.calls.any()).toBeFalsy();
    });
});
3
jurl

TypeScript est compilé en javascript et en javascript chaque méthode est publique. Vous pouvez donc utiliser la notation d'index de tableau pour accéder à des méthodes privées ou à des fichiers, à savoir:

Object['private_field']

Pour plus d'informations, visitez le blog suivant

3
Akoji EI

Aucune cause, vous ne pouvez pas accéder à une fonction privée en dehors du contexte de votre instance. 

Au fait, ce n'est pas une bonne idée d'espionner les objets que vous voulez tester. Lorsque vous testez si une méthode spécifique de votre classe que vous souhaitez tester est appelée, elle ne dit rien. Disons que vous avez écrit le test et qu'il a réussi. Deux semaines plus tard, vous refactorisez quelques éléments de la fonction et ajoutez un bogue. Donc, votre test est toujours vert parce que vous appelez la fonction. B

Les espions sont utiles lorsque vous travaillez avec Injection de dépendances , où toutes les dépendances externes sont passées par le constructeur et non créées dans votre classe. Alors disons que vous avez une classe qui a besoin d'un élément dom. Normalement, vous utiliseriez un sélecteur jQuery dans la classe pour obtenir cet élément. Mais comment voulez-vous vérifier que quelque chose est fait avec cet élément? Bien sûr, vous pouvez l'ajouter à vos pages de tests html. Mais vous pouvez également appeler votre classe en passant l'élément dans le constructeur. Ce faisant, vous pouvez utiliser spy pour vérifier si votre classe interagit avec cet élément comme prévu.

2
Andreas Köberle

Si vous souhaitez tester des fonctions privées au sein d'une classe, pourquoi ne pas ajouter à votre classe un constructeur signalant que ces fonctions privées sont renvoyées?

Lisez-le pour voir ce que je veux dire: http://iainjmitchell.com/blog/?p=255

J'ai utilisé une idée similaire et jusqu'à présent, ça marche super!

0
StevenMcD