Directiva Unit Test Angularjs, que contiene tiempo de espera privado, con Jasmine
Tengo una directiva, que debería comportarse de manera diferente, dependiendo de cuánto tiempo pasó desde su inicialización:
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));
},
}));
El problema es que cuando trato de probarlo con Jasmine, parece que no puedo encontrar una manera de activar este tiempo de espera de ninguna manera. Ya probé un$timeout.flush()
y$timeout.verifyNoPendingTasks()
(que en realidad arroja un error, si voy a comentarflush
llamada). Pero todavía no está activando la ejecución de devolución de llamada de ese tiempo de espera
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');
});
});
La prueba falla.
No puedo encontrar lo que estoy haciendo mal. ¿Algún consejo sobre cómo probar adecuadamente este caso?
Gracias.
UPD Después de una investigación, descubrí que en este caso de prueba en particular, encompileElement
función,value
la propiedad no está siendo evaluada por$compile
Servicio. E igual"value"
. Ya he usado la misma función 10 veces y no puedo entender por qué no se necesita$scope.value
La propiedad de como era antes.