Как я могу проверить AngularJs событие '$ on'?

0

Я использую angularJs, и я хочу проверить $ на событие в моем контроллере, поэтому я пытаюсь написать тестовый пример следующим образом:

 beforeEach(inject(function ($controller,$injector) {
        $rootScope = $injector.get('$rootScope');
        $scope = $rootScope.$new();
         controller = $controller('MyController', { 
            $scope: $scope
         }); 
     }));
     spyOn($rootScope, '$broadcast').and.callThrough();
     spyOn($rootScope, '$on').and.callThrough();

      it('should set $rootScope.settings.layout.pageBodySolid to false', function() {
            controller = CreateTarget();
        expect($rootScope.$broadcast).toHaveBeenCalled();
            expect($rootScope.settings.layout.pageBodySolid).toBe(false);
        });

Но я получаю эту ошибку:

Ошибка: spyOn не смог найти объект для шпионажа для $ broadcast()

Я также пытаюсь сделать тест таким образом:

 beforeEach(inject(function ( $controller,$injector) {
        $rootScope = $injector.get('$rootScope');
        $scope = $rootScope.$new();
         controller = $controller('MyController', { 
            $scope: $scope
         });
          CreateTarget = function() {
                $controller('MyController', {$scope: $scope});
            }

     }));

 it('should set $rootScope.settings.layout.pageBodySolid to false', function() {
            controller = CreateTarget();
            $rootScope.$broadcast('$viewContent');
            expect($rootScope.settings.layout.pageBodySolid).toBe(false);
        });

На этот раз я получаю эту ошибку

TypeError: невозможно прочитать свойство "макет" неопределенного

И это мое событие контроллера

$scope.$on('$viewContent', function () {

                    $rootScope.settings.layout.pageBodySolid = false;
                    $rootScope.settings.layout.pageSidebarClosed = false;
                });

Я не знаю, как я могу это сделать. Это действительно мой первый опыт тестирования angularJs. Мне нужна ваша помощь. Спасибо заранее.

Теги:
karma-jasmine
events

1 ответ

1
Лучший ответ

Здесь есть несколько вопросов:

Во-первых, spyOn. Объем $scope вы передаете в контроллер, на самом деле является новым экземпляром, но вы $rootScope объектом $rootScope, так что это два совершенно разных экземпляра.

Во-вторых, вы не обязательно хотите проверить, что $broadcast или $on вызываются, потому что тогда вы по существу тестируете Angular. То, что вы хотите протестировать в этих случаях, - это ваш собственный код и результат трансляции событий.

Итак, в вашем случае, что вы хотите проверить, так это то, что "когда получено событие $ viewContent, эти два свойства на $rootScope должны быть установлены в false.

Это приводит меня к третьему моменту: layout undefined сообщение layout undefined состоит в том, что вы пытаетесь установить значение в свойстве settings $rootScope, но никогда не инициализируете это ни к чему. В тот момент, когда вы его устанавливаете, он не определен.

TL; DR, вот как вы могли бы это проверить (обратите внимание: этот код может потребоваться изменить. Я набираю это по памяти и не тестирую на самом деле, это просто для того, чтобы дать вам идею)

 beforeEach(inject(function ($controller, $injector, _$rootScope_) {
        $rootScope = _$rootScope;
        $scope = $rootScope.$new();

        $rootScope.settings = {
             layout : {
                 pageBodySolid : true,
                 pageSidebarClosed : true
             }
        };

        controller = $controller('MyController', { 
            $scope: $scope
        });        
     }));

 it('should set $rootScope.settings.layout properties to false', function() {
            $rootScope.$broadcast('$viewContent');

            // Run a digest to notify watchers
            $rootScope.$digest();

            expect($rootScope.settings.layout.pageBodySolid).toBe(false);
            expect($rootScope.settings.layout.pageSidebarClosed).toBe(false);
        });
  • 0
    Большое спасибо @sma за ваш ответ и всю эту информацию. Я буду следовать вашему коду, чтобы сделать мой тест.
  • 0
    Свойства pageBodySolid и pageSidebarClosed @sma должны быть установлены в true для inject function потому что при запуске теста я получаю эту ошибку: Expected true to be false.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню