模拟指令的干净方式是$compileProvider
beforeEach(module('plunker', function($compileProvider){
$compileProvider.directive('d1', function(){
var def = {
priority: 100,
terminal: true,
restrict:'EAC',
template:'<div class="mock">this is a mock</div>',
};
return def;
});
}));
您必须确保模拟比您正在模拟的指令具有更高的优先级,并且模拟是终端的,这样原始指令就不会被编译。
priority: 100,
terminal: true,
结果如下所示:
鉴于此指令:
var app = angular.module('plunker', []);
app.directive('d1', function(){
var def = {
restrict: 'E',
template:'<div class="d1"> d1 </div>'
}
return def;
});
你可以像这样模拟它:
describe('testing with a mock', function() {
var $scope = null;
var el = null;
beforeEach(module('plunker', function($compileProvider){
$compileProvider.directive('d1', function(){
var def = {
priority: 9999,
terminal: true,
restrict:'EAC',
template:'<div class="mock">this is a mock</div>',
};
return def;
});
}));
beforeEach(inject(function($rootScope, $compile) {
$scope = $rootScope.$new();
el = $compile('<div><d1></div>')($scope);
}));
it('should contain mocked element', function() {
expect(el.find('.mock').length).toBe(1);
});
});
还有几件事:
创建模拟时,您必须考虑是否需要replace:true
和/或template
. 例如,如果您模拟ng-src
以防止调用后端,那么您不想也不想replace:true
指定template
. 但是如果你模拟一些视觉上的东西,你可能想要。
如果您将优先级设置为 100 以上,则不会插入模拟的属性。请参阅$compile 源代码。例如,如果你 mockng-src
和 set priority:101
,那么你最终会得到ng-src="{{variable}}"
not ng-src="interpolated-value"
on your mock。
这是一个什么都有的笨蛋。感谢@trodrigues 为我指明了正确的方向。
这是一些解释更多的文档,请查看“配置块”部分。感谢@ebelanger!