Как проверить директивы в модульной области angularjs? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь проверить директиву, которая определена в подмодуле другого подмодуля корневого модуля. Я не могу получить доступ к переменным области, определенным в контроллере директивы. Кажется, проблема заключается в доступе к области действия изнутри теста.

Основной модуль называется oppia, и у него есть подмодуль с именем stateEditorModule, а у этого подмодуля также есть подмодуль с именем stateContentEditorModule. Я попытался ввести $scope вместо $rootScope, но, похоже, это не работает.

Это тестовый код:

  beforeEach(function() {
    module('oppia');
    module('stateEditorModule');
    module('stateContentEditorModule');
  });

    outerScope = $rootScope.$new();
    var elem = angular.element(
      '<state-content-editor>' +
      '</state-content-editor>');
    var compiledElem = $compile(elem)(outerScope);
    outerScope.$digest();
    ctrlScope = compiledElem[0].getControllerScope();
  }));

  fit('should start with the content editor not being open', function() {
    expect(ctrlScope.contentEditorIsOpen).toBe(false);
  });

Переменная contentEditorIsOpen определена в области действия директивы.

contentEditorIsOpen недоступен с текущим состоянием кода.

Я застрял на этом довольно долго, и я был бы признателен, если бы кто-нибудь смог предоставить решение или указать документацию о том, как протестировать мультимодульное приложение AngularJS.

1 Ответ

0 голосов
/ 16 апреля 2019

Обычно вы не будете проверять саму директиву. Вместо этого вы должны проверить контроллер этой директивы.

Это означает, что вам нужно зарегистрировать контроллер в DI. Затем вы можете получить контроллер этой директивы напрямую через DI (без создания и компиляции direcitve), предоставить начальную область видимости этому контроллеру, вызвать функцию и присвоить некоторым переменным этой области видимость определенного значения.

Пример из документа: https://docs.angularjs.org/guide/unit-testing#testing-a-controller

Если вы используете компоненты вместо директив, проверьте это: https://docs.angularjs.org/guide/component#unit-testing-component-controllers

ОБНОВЛЕНИЕ:

Я использовал свойство controllerAs директивы, чтобы присвоить контроллеру имя в виде stateContentEditorController

controllerAs только создает псевдоним для этого контроллера в области действия шаблона, но не регистрирует его в модуле DI (внедрение зависимостей), поэтому вы не можете извлечь его из системы DI.

Я предложил написать вашу директиву и ваш контроллер отдельно и зарегистрировать ваш контроллер, используя angular.module('moduleName').controller('controllerName', [...]). Тогда в вашем определении директивы просто напишите {controller: 'controllerName', ...}. Таким образом, вы можете получить контроллер в ваших тестах.

...