2015-05-27 3 views
6

Как вы выбираете вариант в угловом директивном тесте?Угловые директивные тесты Выберите опции

var options = elem.find('#test-code-select option'); 
expect(angular.element(options[0]).text()).to.equal('234'); 
expect(angular.element(options[1]).text()).to.equal('236'); 

Это прекрасно работает, но как я могу вручную выбрать вариант?

angular.element(options[1]).click(); //nope 
angular.element(options[1]).trigger('click'); //nope 
angular.element(options[1]).attr('selected', true); //nope 

EDIT:

директива шаблон включает в себя выбор с внутренней нг-модели, я подозреваю, что это является причиной проблемы:

<select id='test-code-select' ng-options='code as code for code in codeList' ng-model='code'> 

ответ

10

Это работает для меня:

var select = elem.find('#test-code-select'); 
select.val('236').change(); 
expect(scope.code).toEqual('236'); 

Обратите внимание на вызов change().

+0

удивительно, но это работает. Вам определенно нужен вызов для изменения(). –

0

Если вы просто хотите, чтобы протестировать нажмите обработчик то вам просто необходимо, чтобы вызвать событие щелчка:

angular.element(options[1]).trigger('click');

Возможно, вам придется разрешить выполнение различных обработчиков с помощью $ timeout.flush(), $ scope.apply() и/или путем помещения вашего кода проверки в блок $ timeout.

+0

Пробовал, что с $ таймаута блока, isolateScope() $ применяется, $ дайджеста(). Любые другие идеи? – pschuegr

+0

Попробуйте 'angular.element (опции [1]). Prop ('selected', true);' вы не получите обработчик кликов, но вы должны иметь возможность установить выбранный параметр –

+0

Я предполагаю, что вы имели в виду attr вместо двигательный Это меняет состояние dom, но мне все же приходится обрабатывать изменения. – pschuegr

0
// UPDATE: to select multiple values pass an array 
// select is selector for <select> tag, preferrably ID 
select.val(['236', '479']).change(); 
0

Я добавил это как еще один подход, кроме того, на что ответил @ejain.

Если у вас есть Jquery Avaiable (т.е. не jqLite), я думаю, что следующий должен также работать, вызывая change по выбору:.

var select = elem.find('#test-code-select'); 
var oneOption = select.find('option:contains("236")'); 
oneOption.prop('selected', 'selected').trigger('change'); 
expect(scope.code).toEqual('236'); 
Смежные вопросы