Diretiva Teste de Unidade Angularjs, que contém tempo limite privado, com Jasmine
Eu tenho uma diretiva, que deve se comportar de maneira diferente, dependendo de quanto tempo passou desde a inicialização:
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));
},
}));
O problema é que, quando estou tentando testá-lo com Jasmine, parece que não consigo encontrar uma maneira de disparar esse tempo limite de forma alguma. Já tentei um$timeout.flush()
e$timeout.verifyNoPendingTasks()
(que realmente gera um erro, se eu comentarflush
ligar). Mas ainda não está acionando a execução de retorno de chamada desse tempo limite
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');
});
});
O teste falha.
Não consigo encontrar o que estou fazendo de errado. Alguma dica sobre como testar adequadamente esse caso?
Obrigado.
UPD Após alguma investigação, descobri que, nesse caso de teste específico, emcompileElement
função,value
propriedade não está sendo avaliada por$compile
serviço. E igual"value"
. Eu já usei a mesma função 10 vezes e não consigo entender, por que não está demorando$scope.value
propriedade de como era antes.