Тестирование Angularjs: использование $broadcast не заполняет переменные должным образом

В моем сценарии я делаю следующее:

1) Получить данные из сокета
2) Поднять событие $scope.$broadcast('socket:newData', data)
3) Посмотреть его в директиве:

$scope.processedData = [];
$scope.$on('socket:newData', function(e,data){
  // gets data processed, and adds it to $scope.processedData
  myService.dataProcess($scope.processedData, data);
});

В приложении он работает нормально, и я получаю данные. В моем тесте я определяю $rootScope и $compile. Директива хорошо строится, и я делаю несколько тестов для ее изолированной области, а также для HTML, и все, кажется, в порядке (включая загрузку шаблонов и поддиректив).

Проблема в том, что $scope.prcessedData остается пустым.

Вот мой тестовый код:

beforeEach(module('app'));

beforeEach(_inject(function(_$rootScope_, _$compile_, _myService_){
  $rootScope = _$rootScope_;
  $compile - _$compile_;
  myService = _myService_;
  element = angular.element('<my-directive></my-directive>');
  $compile(element)($rootScope);
}));

beforeEach(function(){
  spyOn(myService, 'dataProcess');
  var data = getMockData(); // returns some data sample that's in the format of the data recieved from the socket
  $rootScope.$broadcast('socket:newData', data);
  $rootScope.$apply();
    });

it('Processed data should be filled', function(){
  // *getExpected* returns the expected processed data  
  expect(element.isolateScope().processedData).toEqual(getExpected(getMockData()));
});

Но element.isolateScope().processedData возвращает []...

Я пробовал следующее, чтобы убедиться, что функция обработки работает правильно:

it('Expect the function "dataProcess" to run', function(){
  expect(myService.dataProcess).toHaveBeenCalledWith(element.isolateScope().processedData, getMockData());
});

Который проходит и по-прежнему element.isolateScope().processedData возвращает []...

Как я могу получить значения после того, как функция выполнила свою работу?


person yccteam    schedule 07.05.2015    source источник


Ответы (1)


Я бы обновил первый метод beforeEach следующим образом:

beforeEach(_inject(function(_$rootScope_, _$compile_, _myService_){
    $rootScope = _$rootScope_;
    $compile - _$compile_;
    myService = _myService_;
    element = $compile(html)(scope);
    scope.$digest();
    isolateScope = element.isolateScope();
}));

У меня были похожие, но разные проблемы, которые решались вызовом $digest() после $compile.

person E. Maggini    schedule 07.05.2015
comment
Я пробовал это раньше, но это не работает. Я также пробовал использовать метод done, но все тот же... [] - person yccteam; 07.05.2015