2017-02-07 2 views
0

Im, используя функцию spyOn jasmine, чтобы попытаться определить, были ли вызовы $ scope. $ Broadcast или нет.

girlnames.spec.js -The контроллер

describe('Girl names controller', function() { 
    var vm, 
     $scope; 

    beforeEach(module('nameStats')); 

    beforeEach(inject(function($controller, $rootScope, $q, _$httpBackend_, _namesService_) { 
     vm = $controller('girlNames', { 
      $scope: $rootScope.$new() 
     }); 

     $scope = $rootScope.$new() 

    })); 


    it('addPersonManually should trigger $scope.$broadcast', function() { 
     spyOn($scope, '$broadcast').and.callThrough() 
     vm.addPersonManually(p) 
     $scope.$digest(); 
     expect($scope.$broadcast).toHaveBeenCalled() 
    }); 

}); 

girlnames.js - контроллер

"use strict"; 

    angular.module('nameStats').controller('girlNames', girlNames); 

    girlNames.$inject = ['$scope', 'namesService']; 

    function girlNames($scope, namesService) { 
     var vm = this; 

     vm.addPersonManually = addPersonManually; 

     function addPersonManually(person) { 
      $scope.$broadcast('personSelected', person); 

     } 
} 

Выход в консоли:

Expected spy $broadcast to have been called. 

ответ

1

Тейк более пристальный взгляд t, как вы создаете свой контроллер

beforeEach(inject(function($controller, $rootScope, $q, _$httpBackend_, _namesService_) { 
    vm = $controller('girlNames', { 
     $scope: $rootScope.$new() 
    }); 

    $scope = $rootScope.$new(); 
})); 

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

Ваш код должен выглядеть следующим образом

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

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

Расширенный кончике

Рассмотрим избавлении от локальных переменных в тестах. Карма держит ссылки на все тестовые костюмы, пока все они не закончат работу, что приведет к огромному потреблению памяти. Это может привести к сбою процесса, если у вас достаточно тестов (в нашем случае это было несколько тысяч). Useful article.

Использование this вместо

beforeEach(inject(function($controller, $rootScope) { 
    this.$scope = $rootScope.$new(); 

    this.ctrl = $controller('girlNames', { 
     $scope: $scope 
    }); 
})); 

it('addPersonManually should trigger $scope.$broadcast', function() { 
    spyOn(this.$scope, '$broadcast').and.callThrough() 
    this.ctrl.addPersonManually(p) 
    this.$scope.$digest(); 
    expect(this.$scope.$broadcast).toHaveBeenCalled() 
}); 
+0

Спасибо, такое простое решение :) – Joel

+0

@Joel принимаю его тогда, ти :) –

Смежные вопросы