2016-07-19 2 views
1

실제 사용자 입력을 시뮬레이트하는 엠버 구성 요소에 대한 테스트를 작성하려고합니다. 예를 들어 :Ember 구성 요소 테스트에서 사용자 입력 시뮬레이션

<div> 
    <input class='js-input' type='text' value='{{ bar }}'> </input> 
    <button class='js-save' type='submit' {{action 'save'}}> 
</div> 

내 구성 요소는 현재 입력의 유효성을 검사 또한 입력 있는지에 따라 다른 값을 계산하고하는 changekeyUp 이벤트를 사용하여 온 - 더 - 플라이 : 그래서

import Ember from 'ember'; 

export default Ember.Component.extend({ 
    bar: null, 
    modelBar: null, 

    updateBar: Ember.on('change', 'keyUp', function() { 
    let bar = this.get('bar'); 
    if (bar.get('notValid')) { 
     bar = null; 
     this.set('bar', ''); 
    } 
    this.set('modelBar', bar); 
    }), 

    actions: { 
    save() { 
     ... save stuff ... 
    } 
    } 
}); 

나 ' 이 부분을 시뮬레이트하려면 $('.js-input').val('some new value')을 사용했습니다 (권장 사항은 here, "렌더링 된 구성 요소와 상호 작용"아래에 있음). 내가 테스트를 실행할 때

test('Updates a thing', function(assert) { 
    assert.expect(1); 

    const newState = 'a new state'; 

    this.set('actions.save', (newTaxes) => { 
    assert.ok(true, 'save has been called'); 
    assert.equal(newState, this.get('modelBar'), 'model is updated correctly'); 
    }); 

    this.set('bar', 'initial state'); 

    this.render(hbs` 
    {{my-component 
     baz=baz 
    }} 
    `); 

    this.$('.js-input').val(newState); 
    this.$('.js-input').trigger('change'); 

    this.$('.js-save').click();  
}); 

는 그러나 change 이벤트가 this.get('bar')를 사용하여 입력에 대한 업데이트 된 값을 얻을하지 않습니다 (내가 this.$('js-input').val()를 사용하는 경우 내가 그것을 볼 수 있지만). 옵저버를 추가하면 관찰자가 해당 속성의 업데이트 된 값을 얻지 만 사용자 지정 변경 이벤트가 발생한 후에 만 ​​ 이 표시됩니다.

나는 Ember 실행 루프와 run.next 루프에서 랩핑을 시도했지만 그 중 하나도 도움이되지 못했습니다. 옵서버로 다시 돌아갈 필요없이이 작업을 할 수있는 방법이 있습니까? (이 구성 요소는 이전에 관찰자에게 사용되었지만 몇 가지 새로운 요구 사항으로 인해 작업이 더욱 복잡해졌습니다.)

+0

내가 해제 방법이 될 수도 있지만 나는 jQuery.sendKeys'은'생각 (이 예를 참조 [바이올린] (http://jsfiddle.net/DxER9/)) 플러그인 것 네가하려는 일을해라. – MilkyWayJoe

+0

흥미 롭습니다! 내가 미래에 탐구 할 수있는 무언가 :) – Hannele

답변