2015-12-28 31 views
9

Mam metodę w usłudze korzystającej z debounowania podkreślnika.Testowanie funkcji wyodrębnionej w Angular z Jasmine nigdy nie wywołuje funkcji

Wewnątrz tej metody znajduje się wywołanie metody w innej usłudze. Próbuję przetestować, że wywoływana jest inna usługa.

W moich prób w celu przetestowania debounced, metoda różnych usług nigdy nie jest wywoływana i jaśmin nie powiedzie się z: «Oczekiwana aMethod szpiegowskiej zostały nazwie»

Wiem na pewno, że jest on wywoływany (loguje się do konsoli w chrome), po prostu nazywa się AFTER, a oczekiwanie już się nie powiodło.

Więc ... (najlepiej) bez dodawania sinon lub innego uzależnienia oraz z
punktów bonusowych * udzielonych rozwiązanie nie musi obrócić _.debounce do $ limit czasu ...

Jak zrobić?

angular.module('derp', []) 
.service('herp', function(){ 
    return { 
    aMethod: function(){ 
     console.log('called!'); 
     return 'blown'; 
    } 
    }; 
}) 
.service('Whoa', ['herp', function(herp){ 
    function Whoa(){ 
    var that = this; 
    this.mindStatus = 'meh'; 
    this.getMind = _.debounce(function(){ 
     that.mindStatus = herp.aMethod(); 
    }, 300); 
    } 
    return Whoa; 
}]); 

testy:

describe('Whoa', function(){ 
    var $injector, whoa, herp; 

    beforeEach(function(){ 
    module('derp'); 
    inject(function(_$injector_){ 
     var Whoa; 
     $injector = _$injector_; 
     Whoa = $injector.get('Whoa'); 
     herp = $injector.get('herp'); 
     whoa = new Whoa(); 
    }); 
    }); 

    beforeEach(function(){ 
    spyOn(herp, 'aMethod').andCallThrough(); 
    }); 

    it('has a method getMind, that calls herp.aMethod', function(){ 
    whoa.getMind(); 
    expect(herp.aMethod).toHaveBeenCalled(); 
    }); 
}); 

Dlaczego bogowie kątowej Testowanie mnie opuścił?

* Nie wiem, jak podać faktyczne punkty bonusowe na stackoverflow, ale jeśli to możliwe, zrobię to.

Odpowiedz

13

Trzeba tylko drwić lodash metodę nieczułości:

describe('Whoa', function(){ 
    var $injector, whoa, herp; 

    beforeEach(function(){ 
    module('derp'); 
    spyOn(_, 'debounce').and.callFake(function(cb) { return function() { cb(); } }); 
    inject(function(_$injector_){ 
     var Whoa; 
     $injector = _$injector_; 
     Whoa = $injector.get('Whoa'); 
     herp = $injector.get('herp'); 
     whoa = new Whoa(); 
    }); 
    }); 

    beforeEach(function(){ 
    spyOn(herp, 'aMethod').andCallThrough(); 
    }); 

    it('has a method getMind, that calls herp.aMethod', function(){ 
    whoa.getMind(); 
    expect(herp.aMethod).toHaveBeenCalled(); 
    }); 
}); 
+0

Nie. Wciąż nie działa. W obu naszych przypadkach nazywany jest herp.aMethod, ale żaden z nich nie jest wywoływany przed oczekiwaniem. –

+0

Chciałbym mieć Chai zgodnie z obietnicą. "ostatecznie" to naprawi. –

+0

umieść punkt przerwania wewnątrz anonimowej funkcji wewnątrz callfake i sprawdź stos, aby zobaczyć skąd jest wywoływany. – Wawy

1

kątowa $timeout ma przewagę w testach, ponieważ jest wyśmiewany w testach być synchroniczne. Ten nie będzie miał takiej przewagi, gdy używane będą asynchroniczne narzędzia firm trzecich. W ogóle asynchroniczne specyfikacje będzie wyglądać tak:

var maxDelay = 500; 

    ... 
    it('has a method getMind, that calls herp.aMethod', function (done){ 
    whoa.getMind(); 
    setTimeout(function() { 
     expect(herp.aMethod).toHaveBeenCalled(); 
     done(); 
    }, maxDelay); 
    }); 

Od podkreślenia debounce nie oferuje flush funkcjonalność (podczas gdy najnowsza wersja Lodash debouncedoes), testowanie asynchroniczny jest najlepszym rozwiązaniem dostępne.

+0

to działa dla mnie z limitem czasu wynoszącym 0 – dliu120