Как проверить '&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(), затем добавили к ней свою функцию и передали ее в экземпляр вашей директивы?

Другие вопросы по тегам