2017-02-07 6 views
0

Ich habe den folgenden Code in einem Dienst.Jasmine So testen Sie eine Funktion, die eine anonyme Funktion zurückgibt

function getK(k) { 
     return function() { 
      return k; 
     }; 
    } 

Ich kann das testen getK mit

beforeEach(inject(function(FiltersService){ 
    this.service = FiltersService; 
    spyOn(this.service, 'getK'); 
})); 

it("getK should be called", function(){ 
    var key = "TEST"; 
    var result = this.service.getK(key); 
    expect(this.service.getK).toHaveBeenCalled(); 
    expect(this.service.getK).toHaveBeenCalledWith("TEST"); 
} 

Meine Frage gestellt wurde, ist, wie ich testen Sie inneren der

return function() { 
    return k; 
} 

Mit Jasmin

EDIT

Um es weiter zu spezifizieren, wird getK function verwendet, um ein Objekt wie unten gezeigt einzufügen. Dieses Objekt ist Teil einer Bibliothek, die ich verwende, die key verwendet. Ich denke, ich bin etwas verwirrt darüber, wie man das aus einer Karma-Jasmin-Perspektive heraus überprüfen kann, da die tatsächliche Implementierung von key Teil einer Bibliothek ist, die ich nicht kontrolliere. So bin ich nicht sicher, wie Tests für die interne getK Funktion zu schreiben, oder auch für die unten valid Funktion sicher sein das Objekt ausgefüllt richtig

libObject.push({ 
    Data: { 
    Name: 'test' 
      }, 
    key: getK("TEST"), 
    valid: function() { 
    return true; 
} 
}); 
+0

Was genau möchten Sie testen? – estus

+0

All das kann ich wirklich testen. Dass es zurückgibt, was ich an getK gesendet habe ... ehrlich gesagt, es ist die Codeabdeckung – user2719805

+0

'expect (result) .toEqual (jasmine.any (Function))' zu bekommen. Sie haben die Details zum Kontext dieser Funktion nicht angegeben, daher ist es nicht möglich, etwas anderes zu sagen. Und ich sehe nicht, warum 'Test, dass getK mit' genannt wurde, benötigt wird. Sie haben '' getK (key) ''genannt. Natürlich wird es natürlich mit "TEST" heißen. – estus

Antwort

3

Unit-Tests setzt für Zeile den Code Zeile Prüfung für die vollständige Abdeckung.

Bedenkt man, dass getK als FiltersService Verfahren ausgesetzt wird, ist es

expect(this.service.getK).toEqual(jasmine.any(Function)); 

var key = {}; 
var result = this.service.getK(key); 

expect(result).toEqual(jasmine.any(Function)); 
expect(result()).toBe(key); 

Es gibt keine Notwendigkeit für einen Spion in dieser Spezifikation, weil es nichts zu spionieren.

2

Da die übergeordnete Funktion Aufruf einer Funktion zurückgibt, rufen Sie die übergeordnete Funktion, und rufen Sie sofort die anonyme Funktion von den Eltern zurückgegeben:

expect(service.getK(k)()).toEqual(k); 

Dies ist sehr einfach und sollte perfekt für Sie arbeiten.

Verwandte Themen