Lutei por meses em como acionar corretamente o evento certo para fazer o angular pegar um clique em um botão de rádio e atualizar o escopo de acordo.
Normalmente você tem algo como:
<input type="radio"
id="myPropertyTrue"
name="myProperty"
ng-value="true"
ng-model="myModel.myProperty"/>
<input type="radio"
id="myPropertyFalse"
name="myProperty"
ng-value="false"
ng-model="myModel.myProperty"/>
<div class="extraFormControls"
ng-if="myProperty">
... dependent form controls ...
</div>
E você pensaria que em seu teste de Jasmim algo assim seria suficiente:
describe 'my page', ->
describe 'when myProperty is true', ->
beforeEach ->
$('myPropertyTrue').click()
it 'shows extra form controls', ->
expect($('.extraFormControls')).toExist()
Mas não vai funcionar. O ng-if não é atualizado. Pode-se pensar que é devido ao escopo não estar atualizado, mas na verdade não é o caso. O problema é que o jQuery .click()
não aciona o evento ‘click’.
Você deveria fazer:
beforeEach ->
$('myPropertyTrue').click().trigger('click')
E isso funciona sempre. Espero que ajude, pois perdi quase 2 dias de trabalho procurando uma solução.
Tentei de tudo, desde um loop assíncrono clicando repetidamente no rádio para disparar o foco, desfoque, abaixamento do mouse, mouseup, mudança, entrada, selecionado, mas nada funcionou. Um pouco contra-intuitivo, mas uma vez que você tenha em sua caixa de ferramentas, certamente não é ciência de foguetes.
Siga-me no twitter: @alexmreis