EmberJS - 测试输入动作

EmberJS - testing input action on enter

我有一个类似于以下内容的 EmberJS (2.5.0) 组件:

{{input type="text" value=searchValue enter='handleSearch'}}

基本上,在输入字段上按回车键应该会触发 'handleSearch' 操作。在我的组件中,到目前为止我有这个:

searchValue: null,
actions: {
  handleSearch() {
    var searchValue = this.get('searchValue');
    var submitSearch = this.get('submitSearch');
    console.log('Search term entered: ', searchValue);
    if (submitSearch) {
      submitSearch(searchValue);
    }
  }
}

并且通过以下方式调用组件:

{{my-component submitSearch=(action 'externalAction')}}

一切正常,但我在实际测试时遇到了问题。

这是我的集成测试(伪复制自 the guide):

test('search input', function(assert) {
  this.set('externalAction', (actual) => {
    console.log('in external action');
    assert.equal(actual, 'hithere');
  });
  this.render(hbs`{{universal-header-search submitSearch=(action externalAction)}}`);
  this.$('input').val('hithere');
  this.$('input').change();
});

问题是,我的 handleSearch 操作处理程序从未被触发。那么如何让我的 input 字段在我的集成测试中触发处理程序呢?我也试过 this.$('input').submit()this.$('input').trigger('change'),但似乎都没有做任何事情。

this.$('input').change(); 触发的是 change 事件,而不是 enter 事件。

经过短暂的研究,我还没有找到在集成测试中触发 enter 事件的解决方案。

您可以通过使用按键事件来解决这个问题,并在您的处理程序中检测回车按钮(回车事件在 jQuery 中不存在,所以我认为 ember 做同样的事情).要在您的处理程序中获取事件,您不能使用 ember 输入助手:

<input type="text" value={{searchValue}} onkeypress={{action "handleSearch"}} />

您的处理人:

handleSearch(event) {
  if(event.keyCode === 13) { //check if enter button was pressed
    var searchValue = this.get('searchValue');
    var submitSearch = this.get('submitSearch');
    console.log('Search term entered: ', searchValue);
    if (submitSearch) {
      submitSearch(searchValue);
    }
  }
}

要在集成测试中触发按键事件,只需使用

this.$('input').keypress();

或者使用回车键触发按键事件

var e = jQuery.Event("keypress");
e.which = 13; //enter button code
e.keyCode = 13;
$('input').trigger(e);

我遇到了同样的问题:我不得不以编程方式触发 Ember 的 (v.2.8) 输入组件的 "enter" 事件

{{input ... enter=(action "someAction")}}

经过一些逆向工程,我找到了解决方案

const e = Ember.$.Event("keyup");
e.which = 13;
e.keyCode = 13;
Ember.$('input').trigger(e);

您可以使用 input 助手的 insert-newline="actionName",它只会在您按下 return/enter 键时触发

<input {{insert-newline="actionName"}}>