2016-03-25 12 views
0

Ich habe die folgende einfache ServiceTestwinkel Service interne Methode aufruft

app.factory('Shoes', function() { 
    function a() {return 12;} 
    function b() {return a();} 

    return { 
     a: a, 
     b: b 
    } 
    }) 

ich testen wollen, ob die Methode a aufgerufen wird, wenn ich Methode aufrufen b. Mein Test sieht so aus:

describe('Testing a Shoes service', function() { 
    var service; 

    beforeEach(module('plunker')); 

    beforeEach(inject(function(Shoes) { 
    service = Shoes; 
    })) 

    it('.b should call .a', function() { 
    spyOn(service, 'a'); 
    service.b(); 
    expect(service.a).toHaveBeenCalled(); 
    }) 

}); 

Aber die Tests scheitern. Relevanter Plünderer ist here.

Frage ist, wie kann ich diese Art von Interaktionen testen?

Antwort

3

Was hier passiert, ist, dass man auf einem Spione auf service.a Methode festgelegt, aber die internen a (die durch b intern genannt wird) ist immer noch das gleiche interne Verfahren (das heißt nicht der Spion), das ist, warum Ihr Test nicht bestehen.

Wenn Sie wirklich tun wollen, ist der einzige Weg, die internen a zu nennen, aber die Methode Ihres Service:

app.factory('Shoes', function() { 
    return { 
     a: function a() { 
      return 12; 
     }, 

     b: function b() { 
      return this.a(); 
     } 
     }; 
}); 

Hier ist ein Update Ihrer plunkr: https://plnkr.co/edit/6FZptdcX9qwyOE6kbgAX

EDIT :

Nur eine Erklärung: die service.a Methode ist nur ein Zeiger auf die interne a Methode. Wenn Sie spyOn(service, 'a') sagen, überschreiben Sie gerade den Zeiger service.a, um auf eine völlig andere Methode zu zeigen (d. H. Einen Spion, der von Jasmin erstellt wurde). Die interne Methode a ist privat und wird nie aktualisiert. Wenn Sie also a() in Ihrer internen Methode b aufrufen, rufen Sie einfach die ursprüngliche Methode a nicht den Spion auf, auf den service.a zeigt.

+0

Warum wird der Spion nicht für die Funktion erstellt, auf die der 'service.a' verweist? – zmii

+0

@zmii Siehe meine Bearbeitung;) – Mickael

+0

zumutbar. Bitte beachten Sie folgende Frage: http://StackOverflow.com/Questions/36222909/Why-Jasmine-Spy-doesn-Resolve-the-Function-Object-by-Reference – zmii

0

ich es geschafft, dieses Problem mit dem folgenden Code

app.factory('Shoes', function() { 
    var module = { 
     a:function(){ 
     return 12; 
     }, 
     b: function(){ 
     return this.a(); 
     } 
    } 
    return module; 
}); 

Es scheint, wie Ihr getestetes Modul beheben können nicht nur eine „Funktion“ nennen. Es sollte die Methode des zurückgegebenen Objekts aufrufen;

Aktualisiert Plunker: https://plnkr.co/edit/DeDmdQq3rguO6uGHElW6?p=preview

+0

Warum der Spion nicht für die Funktion, dass die ' Service.a' Referenzen? Sollten die Referenzen nicht in Originalfunktionen aufgelöst werden? – zmii

0
app.factory('Shoes', function() { 

var self = { 
    a: function() {return 12;}, 
    b: function() {return this.a();} 
} 

return { 
    a: self.a, 
    b: self.b 
} 
}) 

Ich glaube, das ist, weil b nicht die Funktion aufrufen Sie ausspioniert. Mit Fabrik über Testdurchläufen.

+0

Warum wird der Spion nicht für die Funktion erstellt, auf die der 'service.a' verweist? Sollten die Referenzen nicht in Originalfunktionen aufgelöst werden? – zmii

+0

spyOn (Dienst, 'a') - erstellt neue Spion-Funktion auf der Stelle des Dienstes.a, während, wenn b Funktionen aufgerufen wird, ruft es interne Funktion ein, die in demselben Umfang existiert, und kein Spion, der von Jasmin im Grunde erstellt wurde was Mickael oben als Antwort gesagt hat. So sehe ich persönlich dieses Problem. –

Verwandte Themen