2017-10-15 2 views
1

J'essaie de tester si une méthode locale (méthode 1) est appelée à partir d'une autre méthode (méthode). J'ai essayé quelque chose comme ceci mais cela ne fonctionne pas car la méthode 1() a toujours la définition originale. L'extrait de code ressemble à ceci:En utilisant Jasmine comment vérifier si une méthode locale a été appelée?

var ClassA = function() { 
    var method1 = function() { 
     console.log('method1'); 
    }; 
    var method2 = function() { 
     method1(); 
    }; 
    return {method1: method1, method2: method2} 
} 

Cas de test:

it("should call method1 when method2 is called", function() { 
    var objectA = new ClassA(); 
    spyOn(objectA, 'method1').andCallThrough; 
    objectA.method2(); 
    expect(objectA, 'method1').toHaveBeenCalled(); 
}); 

Essayé primordial method1 à sans aucun succès:

objectA.method1 = jasmine.createSpy('aSpy').andCallThrough(); 
+0

Votre code semble correct, mais il vous manque le '()' dans la ligne 'spyOn (objectA, 'method1'). EtCallThrough;'. –

Répondre

0

Lorsque vous appelez new ClassA() vous invoquez la ClassA fonctionner et obtenir un nouvel objet avec le prototype correspondant. Cela signifie que lorsque vous spyOn (ClassA, "doSomething") vous ne configurez pas d'espion sur l'objet renvoyé par le nouvel appel, mais sur une fonction possible doSomething sur la fonction ClassA elle-même. Vous devriez être en mesure de faire quelque chose comme:

it("calls method1", function() { 
    var originalConstructor = ClassA, 
     spiedObj; 
    spyOn(window, 'ClassA').and.callFake(function() { 
    spiedObj = new originalConstructor(); 
    spyOn(spiedObj, 'method1'); 
    return spiedObj; 
    }); 
    method2(); 
    expect(spiedObj.method1).toHaveBeenCalled(); 
}); 

S'il vous plaît laissez-moi savoir si cela fonctionne sinon nous pouvons discuter plus.

+0

Apurva, Merci pour votre réponse. Est-ce que cela fonctionne pour vous? La méthode 2() est appelée depuis spiedObj ou originalConstructor? – ambar