Unit Test Angularjs Direktive, die ein privates Timeout enthält, mit Jasmine
Ich habe eine Anweisung, die sich anders verhalten sollte, je nachdem, wie viel Zeit seit der Initialisierung vergangen ist:
am.directive('showText', () => ({
restrict: 'E',
replace: true,
scope: {
value: '@'
},
controller: ($scope, $timeout) => {
console.log('timeout triggered');
$scope.textVisible = false;
let visibilityCheckTimeout = $timeout(() => {
if (parseInt($scope.value, 10) < 100) {
$scope.textVisible = true;
}
}, 330);
// Clear timeout upon directive destruction
$scope.$on('$destroy', $timeout.cancel(visibilityCheckTimeout));
},
}));
Das Problem ist, dass ich beim Versuch, es mit Jasmine zu testen, keine Möglichkeit finde, dieses Timeout in irgendeiner Weise auszulösen. Schon ein @ ausprobie$timeout.flush()
und$timeout.verifyNoPendingTasks()
(was eigentlich einen Fehler auslöst, wenn ich @ kommentieren werflush
Anruf). Aber es löst immer noch nicht die Callback-Ausführung dieses Timeouts aus
describe('showText.', () => {
let $compile;
let $rootScope;
let $scope;
let $timeout;
const compileElement = (rootScope, value = 0) => {
$scope = rootScope.$new();
$scope.value = value;
const element = $compile(`
<show-text
value="value"
></show-text>
`)($scope);
$scope.$digest();
return element;
};
beforeEach(() => {
module('app.directives.showText');
inject((_$compile_, _$rootScope_, _$timeout_) => {
$compile = _$compile_;
$rootScope = _$rootScope_;
$timeout = _$timeout_;
});
});
it(`Process lasts > 0.33s. Should show text.`, () => {
const VALUE = 30;
const element = compileElement($rootScope, VALUE);
const elementContent = element.find('.show-text__content');
$timeout.flush(1000);
$timeout.verifyNoPendingTasks();
$rootScope.$digest();
expect(element.isolateScope().textVisible).toBeTruthy();
expect(elementContent.length).toEqual(1);
expect(elementContent.text().trim()).toBe('Example text');
});
});
Test schlägt fehl.
Kann nicht finden, was ich falsch mache. Irgendwelche Tipps, wie man einen solchen Fall richtig testet?
Vielen Dank
UPD Nach einigen Nachforschungen habe ich festgestellt, dass in diesem speziellen Testfall incompileElement
Funktion,value
Eigenschaft wird nicht von @ ausgewert$compile
Bedienung. Und gleich"value"
. Ich habe dieselbe Funktion bereits zum zehnten Mal verwendet und kann nicht verstehen, warum es kein @ brauch$scope.value
's Eigentum wie es vorher war.