How to unit testing an $destroy event of a Directive in angularjs?
I have the code in my directive:
scope.$on(\'$destroy\', function () {
//clean som
Here is what I do:
var destroyed = spyOn(scope, '$destroy').and.callThrough();
scope.$destroy();
expect(destroyed).toHaveBeenCalled();
unlike other answers I don't have to create flag variables that only make sense for testing, also, it makes more sense to me to use Jasmine spyOn and callThrough to check if the function $destry is being successfully called.
You should test the code that is executed within the $destroy
event. Here's a contrived example using a controller:
Test
it('sets destroyed to true when the scope is destroyed', function() {
// Arrange
$scope.destroyed = false;
// Act
$scope.$destroy();
// Assert
expect($scope.destroyed).toBe(true);
});
Controller
app.controller('MainCtrl', function($scope) {
$scope.$on('$destroy', function() {
$scope.destroyed = true;
});
});
Plunker here.
You can select the DOM from the template of your directive and get the scope of it, then run $destroy().
Ex:
your tpl:
"<div id='tuna'></div>"
your test:
it('test on destroy', function(){
var isolateScope = $(element).find('#tuna').eq(0).scope();
isolateScope.$destroy();
})
Hope help you!
Angular's isolateScope
is preferable to using jQuery. You've probably compiled the element in a beforeEach above your test like this:
myEl = '<div my-el>MY EL</div>';
scope = $rootScope.$new();
directiveElement = $compile(myEl)(scope);
scope.$digest();
Now in your test you can access the isolateScope
and call $destroy
:
var isolated = directiveElement.isolateScope();
isolated.$destroy();