Как проверить '&attr' из директивы с изолированной областью, используя карму?
Я пытаюсь проверить функцию обратного вызова директивы
Быть коротким (угловой 1.x, карма и angular-mocks):
Директивные пункты:
- $scope.show - это функция
- $scope.show ожидаемый параметр "message"
Код директивы:
angular.module('test', [])
.controller('alertCtrl', function($scope) {
$scope.show({
message: 'Hello'
})
})
.directive('alert', function() {
return {
controller: 'alertCtrl',
scope: {
show: '&'
}
}
})
Спецификация:
beforeEach(function () {
$scope.show = function (message) {
alert(message)
}
})
it('must execute an expression', function(){
element = $compile(`
<alert show="show(message)"></alert>`)($scope);
$scope.$digest() // It makes no difference
scope = element.isolateScope()
scope.$digest() // It makes no difference
console.log(angular.mock.dump(scope)) // scope.show == undefined
})
После завершения компиляции свойство директивы show не определено. Я что то пропустил?
РЕДАКТИРОВАТЬ:
Полный код...
angular.module('test', [])
.controller('alertCtrl', function($scope) {
$scope.show({
message: 'Hello'
})
})
.directive('alert', function() {
return {
controller: 'alertCtrl',
scope: {
show: '&',
bind: '=',
string: '@'
}
}
})
describe('test', function(){
beforeEach(angular.mock.module('test'));
beforeEach(angular.mock.inject(function (_$compile_, _$rootScope_) {
$compile = _$compile_;
$scope = _$rootScope_.$new();
}))
beforeEach(function () {
$scope.show = function (message) {
alert(message)
}
$scope.bind = {data: 123}
})
it('must execute an expression', function(){
element = $compile(`
<alert show="show(message)"
bind="bind"
string="'World'"
></alert>`)($scope);
$scope.$digest() // It makes no difference
scope = element.isolateScope()
scope.$digest() // It makes no difference
console.log(angular.mock.dump(scope)) // scope.show == undefined
})
})
Вывод karma... ALERT: 'Hello' LOG: ' Scope(3): { show: undefined bind: {"data":123} string: "'World'" }' Chrome 59.0.3071 (Linux 0.0.0): Выполнено 1 из 1 УСПЕХ (0,01 с / 0,036 с)
1 ответ
Похоже, вы объявляете функцию show в неверной общей области видимости var. Вы объявили область действия var прямо в своем объявлении и инициализировали ее в предыстории с помощью $rootScope.$ New(), затем добавили к ней свою функцию и передали ее в экземпляр вашей директивы?