Имитация функции ng-init Angulars в тесте Jasmine

Я хотел бы ввести эту функцию в директиву ng-init, когда я создаю экземпляр контроллера в угловом тесте, в html я бы настроил его следующим образом:

 <div ng-controller="my-ctrl" ng-init="initialize({updateUrl: 'list_json'})

В моем тесте я мог бы просто написать подобную функцию, которая будет вставлять правильные вещи в область, но я думаю, что это беспорядочно. Также я беспокоюсь о функции, которая в настоящее время жестко запрограммирована в html, испортив ее в моем промежуточном тесте.

function initController($scope){

  $scope['updateUrl'] = 'list_json'

}

person FutuToad    schedule 10.01.2014    source источник


Ответы (1)


Я не думаю, что ng-init создает какие-либо функции сам по себе, поэтому я думаю, что это просто неправильный способ его использования (судя по вашим фрагментам).

Что я обычно делаю, так это создаю функцию инициализации самостоятельно, а затем без проблем проверяю ее в модульном тесте контроллера.

<div ng-controller="my-ctrl" ng-init="init({ updateUrl : 'list_json' })">...</div>

function MyController($scope){

  $scope.init = function(config) {
     $scope.updateUrl = config.updateUrl;
  }

}

Затем в Jasmine вы можете без проблем написать тест, который будет вызывать функцию init() (шаблон пропущен):

// Given
var config = { updateUrl : 'list_json' };
// When
myController.init(config);
// Then
// ...

Важный комментарий о модульном тестировании

Если вы думаете, что вам следует проверить, вызывает ли ваша HTML-разметка init() с заданными параметрами, то я думаю, что вы ошибаетесь. Просто не на чем тестировать. Логики там нет вообще! Ваши тесты должны проверять, что компоненты работают так, как они должны работать, если программист совершит ошибку, передав неправильные параметры из HTML в Angular, то вам не следует беспокоиться о покрытии таких ошибок в модульных тестах. Нельзя заставить людей не ошибаться :-)

person ŁukaszBachman    schedule 10.01.2014