Подтвердить что ты не робот

Как проверить события в angular?

Мне нужно проверить, что события корректно выбрасываются или транслируются, а также запускать события вручную.

Какой лучший способ сделать это?

4b9b3361

Ответ 1

Если вам просто нужно какое-то тестирование при запуске и уловке событий, вот как я это делаю. Для обеспечения того, чтобы определенное событие было запущено ($emit -ed или $broadcast -ed), шпион - это путь. Вам нужна ссылка на область, которая будет вызывать $emit или $broadcast, а затем просто сделать что-то вроде этого:

spyOn(scope, "$emit")
//run code to test
expect(scope.$emit).toHaveBeenCalledWith("MY_EVENT_ID", other, possible, args);

Если вам не нужно или не нужно беспокоиться о аргументах, переданных с помощью $emit, вы можете поместить $on в $rootScope и установить флаг, чтобы знать, что событие было выпущено, Что-то вроде этого:

var eventEmitted = false;
$rootScope.$on("MY_EVENT_ID", function() {
   eventEmitted = true;
});
//run code to test
expect(eventEmitted).toBe(true);

Для тестирования функциональности, выполняемой при обнаружении события ($on), это немного проще. Просто получите $rootScope из функции inject и отправьте нужное событие.

$rootScope.$broadcast("EVENT_TO_TEST", other, possible, args);
//expects for event here

Теперь я полагаю, что эта обработка событий будет происходить в директиве или контроллере (или и том и другом). Для настройки директивных тестов см. https://github.com/vojtajina/ng-directive-testing. Для настройки тестов контроллера см. https://github.com/angular/angular-phonecat/blob/master/test/unit/controllersSpec.js#L27

Надеюсь, что это поможет.

Ответ 2

Ниже приведены шаги, которые следует выполнить для события $broadcast в angular JS

При инициализации инициализации корневого окна и области видимости области, как показано ниже:

var rootScope;
var scopeStub = beforeEach(function() {
    inject(function($rootScope, _$controller_) {
        rootScope = $rootScope;
        scopeStub = $rootScope.$new();
        $controller = _$controller_;
    });
});

После того, как контроллер создал событие рейса с помощью rootScope, как показано ниже:

rootScope.$broadcast('eventName', parameter1);

Ответ 3

Мы использовали этот синтакс для A1

=========== Controller ========
    var vm = this;
    $scope.$on('myEvent', function(event, data){
        console.log('event number', data.id);
    });
============ Test =============
 it('should throw myEvent', function() {
    var data = {};
    $scope.$broadcast('myEvent', {id:1});
    $scope.$broadcast('myEvent', {id:2});
    $scope.$broadcast('myEvent', {id:3});
});

============ Output ============
Chrome LOG: '--------------------------------------------'
Chrome LOG: 'event number', 1
Chrome LOG: 'event number', 2
Chrome LOG: 'event number', 3