Jasmin.clock().tick() funktioniert nicht mit $timeout und debounce, aber funktioniert gut mit setTimeout
Unten habe ich 3 Funktionen, die genau das tun die gleiche Sache. Jeder verwendet eine andere Art von aufrufen von setTimeout, delay1() verwendet, setTimeout direkt, delay2() verwendet angularjs $timeout und delay3() verwendet, lodash debounce. Sie alle funktionieren.
Probleme tritt auf, wenn ich den test mit Jasmin. setTimeout funktioniert gut mit Jasmin.clock().tick () - Methode, $timeout und debounce nicht
Ich bin daran interessiert, debounce arbeiten mit Jasmin. Ich weiß, dass ich verwenden können, $timeout.flush() mit angularjs aber $timeout und setTimeout mir Probleme an anderer Stelle in meinem code, wo ich es mit mit leaflet maps. debounce funktioniert gut, mit Packungsbeilage.
Habe ich eine plunker hier: plnkr wo sehen Sie die $timeout und debounce-tests nicht übergeben, während die setTimeout-test übergibt.
Gibt es eine Möglichkeit, kann ich dieses problem umgehen? Dank
JS
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, $timeout) {
$scope.name = 'World';
$scope.delayed1 = function(){
setTimeout(function(){
$scope.name = "Hello world by setTimeout";
},500)
}
$scope.delayed2 = function(){
$timeout(function(){
$scope.name = "Hello world by $timeout";
},500)
}
$scope.delayed3 = function(){
_.debounce(function(){
$scope.name = "Hello world by debounce";
},500)
}
});
spec
describe('Testing a Hello World controller', function() {
var $scope = null;
var ctrl = null;
//you need to indicate your module in a test
beforeEach(module('plunker'));
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
ctrl = $controller('MainCtrl', {
$scope: $scope
});
}));
it('should say hallo to the World', function() {
expect($scope.name).toEqual('World');
});
it('should say Hello world by setTimeout', function() {
jasmine.clock().install();
$scope.delayed1();
jasmine.clock().tick(600);
expect($scope.name).toEqual('Hello world by setTimeout');
jasmine.clock().uninstall();
});
it('should say Hello world by timeout', function() {
jasmine.clock().install();
$scope.delayed2();
jasmine.clock().tick(600);
expect($scope.name).toEqual('Hello world by timeout');
jasmine.clock().uninstall();
});
it('should say Hello world by debouce', function() {
jasmine.clock().install();
$scope.delayed3();
jasmine.clock().tick(600);
expect($scope.name).toEqual('Hello world by debouce');
jasmine.clock().uninstall();
});
});
- jede Schlussfolgerung, die auf dieser?
- Nein, noch nicht. Irgendjemand?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Uhr in Jasmin wird nur funktionieren, wenn Sie die Prüfung
setInterval()
odersetTimeout()
Funktionen direkt, wie es nur verhöhnt jene Funktionen, die speziell auf synchron laufen. Ich glaube, es gibt eine pull-Anfrage für Jasmin zu verspotten das Date-Objekt, die es erlauben würde, für die Funktionen zu testen wie_.debounce()
ohne Spott, aber ich erinnere mich nicht, wenn das zusammengeführt wurde oder nicht.Testen
_.debounce()
Sie haben, zu verhöhnen, als es um synchron ausgeführt zu werden, vorzugsweise als ein Spion, oder Sie können nur die Funktion überschreiben. Hier ist, was ich gefunden habe, die für mich arbeiten:Ruft nun zu
_.debounce()
laufen synchron und tests sollten erfolgreich abgeschlossen. Natürlich werden Sie noch verwenden Sie$timeout.flush()
.Ich aktualisiert Ihre plunker mit diesen änderungen: http://plnkr.co/edit/KXmwcf1faUNf8nlqPeyd
spyOn(_, 'debounce').and.callFake(_.identity);
Zusätzlich zu @JDWardle die Antwort, die du maye wollen auch ein Spion für die debounce-Methode Abbrechen.
Die debounce-Funktion von
lodash
verwendet dieDate
Objekt. Sie verhöhnen dieDate
Objekt mitjasmine
wie diese:Quelle: https://jasmine.github.io/2.9/introduction.html#section-Mocking_the_Date