我真的很难在angularjs指令上运行业力单元测试。这是我的设置:
var scope, ele;
var template = '<div data-my-directive data="data" config="config"></div>';
beforeEach(function () {
// Load directive's module
module('dashboard');
module('templates-dev');
// Load mock services/data (overriding real implementation)
module(function($provide) {
$provide.value("MockWidgetData", new MockWidgetData());
});
// Construct services/data to be available
// inside each testing block.
inject(function($rootScope, $compile, MockWidgetData) {
// Create a fresh scope
scope = $rootScope.$new();
ele = angular.element(template);
// Fill that scope with mock data
scope.config = MockWidgetData.config;
scope.data = MockWidgetData.data;
// Compile the element and attach our scope
$compile(ele)(scope);
// Digest the scope to trigger a scope update
// and attach our directive's link function
scope.$digest();
});
});
我的指令将'data'和'config'对象传递给它的子节点,这恰好是其他指令。该指令本身使用templateUrl
,这就是我提供module(templates-dev)
:html2js预编译,角度模块化,$templateCache
'版本模板的原因。以下是我的指令templateUrl
:
<div id="container">
<button id="my-btn" ng-click="doSomething('parameter')"></button>
<div other-dir data="data" config="config"></div>
</div>
以下是我的指示示例:
angular.module('dashboard').directive('myDirective', function() {
return {
restrict: 'A',
templateUrl: 'my-dir-template.html',
scope: { //
data: '=',
config: '='
},
replace: true,
link: function(scope, element, attrs) {
scope.someFunc() = { ... },
scope.someFunc1() = { ... },
});
问题:
ele.find("#my-btn").eq(0)
捕获我的指令html的一些元素,但没有一个正常的函数可以工作(.click()等)。
我做错了什么?编译过程有问题吗?我构建测试错了吗?我应该尝试删除链接功能并用控制器替换它吗?我的范围还没有排好,我现在已经两天失败了......有点烦人。
经过仔细检查......看起来我scope.$digest()
之前$compile(ele)(scope)
可以正确地将“数据”和“配置”对象传播到子范围。但是,我的范围失去了对我的指令链接中定义的函数的访问权限。
答案 0 :(得分:0)
您应该在scope.$digest()
之后致电$compile(ele)(scope)
。摘要是进行指令编译所必需的。您的指令具有独立的范围,这就是您无法访问其功能的原因。为了得到它们你应该试试这个:
var elScope = element.isolateScope();
在这里你得到了你的elScope.someFunc();
检查单元测试指令的这个例子:
http://best-web-creation.com/articles/view/id/angular-js-unit-test-directive?lang=en