如何在 angularjs 中对指令的 $destroy 事件进行单元测试?
我的指令中有代码:
scope.$on('$destroy', function () {
//clean something
});
我的测试代码:
it('on destroy',function(){
scope.$destroy();
scope.$digest();
//expect everything done?
});
任何建议!
如何在 angularjs 中对指令的 $destroy 事件进行单元测试?
我的指令中有代码:
scope.$on('$destroy', function () {
//clean something
});
我的测试代码:
it('on destroy',function(){
scope.$destroy();
scope.$digest();
//expect everything done?
});
任何建议!
您应该测试在$destroy
事件中执行的代码。这是一个使用控制器的人为示例:
测试
it('sets destroyed to true when the scope is destroyed', function() {
// Arrange
$scope.destroyed = false;
// Act
$scope.$destroy();
// Assert
expect($scope.destroyed).toBe(true);
});
控制器
app.controller('MainCtrl', function($scope) {
$scope.$on('$destroy', function() {
$scope.destroyed = true;
});
});
Plunker在这里。
您可以从指令的模板中选择 DOM 并获取它的范围,然后运行 $destroy()。
前任:
你的 tpl:
"<div id='tuna'></div>"
你的测试:
it('test on destroy', function(){
var isolateScope = $(element).find('#tuna').eq(0).scope();
isolateScope.$destroy();
})
希望能帮到你!
AngularisolateScope
比使用 jQuery 更可取。您可能已经在测试上方的 beforeEach 中编译了元素,如下所示:
myEl = '<div my-el>MY EL</div>';
scope = $rootScope.$new();
directiveElement = $compile(myEl)(scope);
scope.$digest();
现在在您的测试中,您可以访问isolateScope
并调用$destroy
:
var isolated = directiveElement.isolateScope();
isolated.$destroy();
这是我所做的:
var destroyed = spyOn(scope, '$destroy').and.callThrough();
scope.$destroy();
expect(destroyed).toHaveBeenCalled();
与其他答案不同,我不必创建仅对测试有意义的标志变量,而且,使用 Jasmine spyOn 和 callThrough 来检查函数 $destry 是否被成功调用对我来说更有意义。