如何在指令中测试angular的$destroy事件?

9
该指令(隔离作用域,转换,替换)将一个掩码插入到<body>中。
var mask = angular.element('<div id="mask"></div>');

$document.find('body').append(mask);

scope.$on('$destroy', function() {
    mask.remove();
});

我正在尝试通过对范围进行简单广播来测试此案例:

var $document, scope, element, rootScope;

beforeEach(inject(function($compile, _$document_, $rootScope, $injector) {
    rootScope = $injector.get('$rootScope');
    scope = $rootScope;
    $document = _$document_;
    mask = $document.find('#mask');
    element = $compile(angular.element('<overlay id="derp"></overlay>'))(scope);
}));

it('should remove mask when casting the $destory event', function (done) {
    scope.$broadcast('$destroy');
    scope.$digest();
    expect($document.find('#mask').length).toBe(0);
});

有什么想法,为什么这不起作用?

你能展示指令和整个规范吗? - Ilan Frumer
产生相同的结果。 - e382df99a7950919789725ceeec126
1个回答

6
错误原因是:该指令为多个覆盖层创建了多个
。 当向DOM添加具有相同ID的多个
时,Angular似乎会出现问题。 解决此问题后,所有内容按预期工作。
it('should remove mask when $destoryed', function () {
    scope.$destroy();
    expect($document.find('#mask').length).toBe(0);
});

如果没有看到指令本身,就不可能检测到它。下次您发布有关指令测试的问题时,请确保发布更多的指令代码。 - Ilan Frumer
1
你可以省略 scope.$apply(); - Ilan Frumer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接