2016-02-03 6 views
9

Ich benutze MeteorJS mit Winkel und möchte Controller testen. Mein Controller verwendet $ reactive (this) .attach ($ scope). Ich muss überprüfen, ob diese Methode aufgerufen wurde.Jasmine spyOn auf Funktion und zurückgegebenes Objekt

schaffe ich so etwas für spy:

var $reactive = function(ctrl) { 
    return { 
     attach:function(scope) {} 
    } 
}; 

So kann ich es so nennen:

$reactive('aaa').attach('bbb'); 

Wie kann ich es in den Tests tun?

spyOn($reactive, 'attach'); 

Funktioniert nicht. Ich habe Fehler: attach() -Methode nicht vorhanden

Und wie überprüfen, ob es aufgerufen wurde? Das ist ein guter Anruf?

expect($reactive).toHaveBeenCalledWith(controller); 

Und wie zu überprüfen, dass Funktion anhängen mit Args (Scope) aufgerufen wurde?

+0

Sieht aus wie '$ reactive' ein Objekt zurückgibt, dass das Verfahren anhängen enthält, nicht wahr? Und Sie möchten diese 'attach' Methode testen, die aufgerufen wurde. – Raulucco

+0

@Raulucco Genau – psalkowski

Antwort

4

Sie müssen die Komponente verspotten. Ersetzen Sie es durch einen Spion, der im Rahmen des Tests spyObj zurückgibt. Dann lösen Sie aus, was die Methode zum Ausführen und Testen macht.

var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']); 
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult); 
var controller = {}; 
    beforeEach(function() { 
     module(function ($provide) { 
     $provide.factory('$reactive', $reactive); 
     }); 
     module('yourAppModule'); 
    }); 

it('Should call attach', function() { 
    $reactive(controller).attach(); 
    expect($reactive).toHaveBeenCalledWith(controller); 
    expect(reactiveResult.attach).toHaveBeenCalled(); 
}) ; 

können Sie stellen die $reactive Spion die Steuerung zu Abhängigkeiten:

var reactiveResult = jasmine.createSpyObj('reactiveResult', ['attach']); 
var $reactive = jasmine.createSpy('$reactive').and.returnValue(reactiveResult); 
var ctrl; 
    beforeEach(inject(function ($controller) { 
     ctrl = $controller('YourController', {$reactive: $reactive }); 
    })); 

it('Should call attach', function() { 
    //ctrl.triggerThe$reactiveCall 
    expect($reactive).toHaveBeenCalledWith(ctrl); 
    expect(reactiveResult.attach).toHaveBeenCalled(); 
}) ; 
+0

Vielen Dank! Jetzt weiß ich etwas mehr über Tests. – psalkowski

Verwandte Themen