2015-05-27 1 views
6

Come si seleziona un'opzione in un test di direttiva angolare?Test di controllo angolare selezionare le opzioni

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'); 

Questi funzionano bene, ma come forzare manualmente la selezione di un'opzione?

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

EDIT:

Il modello direttiva include una selezione con una ng-modello interno, ho il sospetto che questa è la causa del problema:

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

risposta

10

questo funziona per me:

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

nota la chiamata a change().

+0

sorprendente, ma questo funziona. Hai sicuramente bisogno della chiamata per cambiare(). –

0

Se si desidera solo per testare la clicca gestore allora non vi resta che attivare un evento click:

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

Potrebbe essere necessario consentire l'esecuzione dei vari gestori utilizzando $ timeout.flush(), $ scope.apply() e/o inserendo il codice di verifica in un blocco di timeout $.

+0

provato che con il blocco $ timeout, isolateScope() $ applicare, $ digerire(). Altre idee? – pschuegr

+0

Prova 'angular.element (opzioni [1]). Prop ('selected', true);' non otterrai il gestore dei clic, ma dovresti essere in grado di impostare l'opzione selezionata –

+0

Suppongo tu abbia inteso attr invece di puntello. Ciò altera lo stato dom - ma devo ancora elaborare la modifica. – pschuegr

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

Ho aggiunto questo come un altro approccio oltre a quello che è stato risposto da @ejain.

Se hai jquery avaiable (cioè non jqLite), penso che il seguente dovrebbe funzionare anche innescando change in opzione:.

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');