如何测试指令是否发出事件
How to test if directive emited an event
我有这个简单的指令:
...
var readyData = {
caption: ctrl.caption,
leftValue: ctrl.leftValue,
rightValue: ctrl.rightValue,
};
$scope.$emit($attrs.id + ".ready", readyData); //$scope is directive's scope and not $rootScope
}
我有以下测试:
describe("Directive: summaryItem", function () {
// load the directive"s module
beforeEach(module("summaryItem"));
it("Should emit the ready event", inject(function ($compile) {
element = angular.element("<summary-item id='"summaryItem'"></summary-item>");
element = $compile(element)(scope);
scope.$digest();
var dscope = element.scope();
spyOn(dscope, "$emit");
//run code to test
expect(dscope.$emit).toHaveBeenCalledWith("summaryItem.ready");
}));
我收到以下错误:
Expected spy $emit to have been called with [ 'summaryItem.ready' ] but it was never called.
我该如何解决这个问题?谢谢!
更新
对于@themyth92请求,这里是完整的指令代码:
"use strict";
(function (angular) {
/**
* @ngdoc directive
* @name summaryItemApp.directive:summaryItem
* @description
* # summaryItem
*/
angular.module("summaryItem")
.directive("summaryItem", function () {
return {
templateUrl: "views/summary-item.html",
restrict: "E",
transclude: true,
controller: SummaryItemCtrl,
controllerAs: 'ctrl',
bindToController: true,
scope: {
options: "=",
caption: "="
}
};
});
function SummaryItemCtrl($scope, $attrs) {
var ctrl = this;
ctrl.caption = this.caption;
if(this.options) {
ctrl.leftValue = this.options.leftValue;
ctrl.rightValue = this.options.rightValue;
}
var readyData = {
caption: ctrl.caption,
leftValue: ctrl.leftValue,
rightValue: ctrl.rightValue
};
$scope.$emit($attrs.id + ".ready", readyData);
}
}(angular));
测试中有两个问题。首先,该事件将在第一次$scope.$digest()
调用时触发。在您的测试中,您在摘要之后模拟$emit
函数,因此这将不起作用。
此外,由于指令使用隔离作用域,因此element.scope()
不会执行您希望它执行的操作。在这种情况下,element.scope()
将返回元素的原始范围; element.isolateScope()
将返回指令引入的隔离范围。
但是,还有另一种方法可以对此进行测试。由于 -ted 事件$emit
冒泡到其父作用域,因此还可以测试其中一个父作用域是否接收了正确的事件。
未经测试的代码:
it("Should emit the ready event", inject(function ($compile) {
var emitted = false;
scope.$on('summaryItem.ready', function() {
emitted = true;
});
element = angular.element("<summary-item id='"summaryItem'"></summary-item>");
element = $compile(element)(scope);
scope.$digest();
expect(emitted).toBe(true);
}));
作为改进,您还可以存储事件而不仅仅是true
,这允许您对发出的事件进行各种expects
。
相关文章:
- 内容安全策略指令:;脚本src'self'blob:文件系统:chrome扩展资源:“;获取是否时
- 是否有任何不需要后端的验证码角度指令
- 是否有JavaScript DEFINE 指令等效项
- 如何测试指令是否发出事件
- 是否可以在自定义指令中使用理解表达式
- 指令,如何检测它是否已完全呈现
- 检查指令是否具有属性
- Angular 在使用 jq 追加方法时是否编译指令
- AngularJS - 是否可以在链接或编译中的指令上更改ngModel属性的值
- 是否有
指令的 isOpen 属性 - 角度指令链接函数中的范围是否与角度指令控制器中的$scope相同
- 是否可以将“必需”传递到 AngularJS 指令中
- 检查是否传递了指令属性
- Angular 指令是否需要将依赖注入到控制器中
- AngularJS:是否可以访问在ng-hide指令中调用函数的html元素
- AngularJS指令,用于检查复选框列表中是否至少选中了一个项目
- 当从指令中删除元素时,AngularJs 是否会自动销毁范围
- 将多个ngModel值传递给一个指令-是否可能
- 检查指令是否计算为特定的HTML元素
- 检测指令是否被从DOM中移除