应用和测试中的ember事件触发顺序是不同的

时间:2014-12-28 10:26:31

标签: ember.js qunit ember-qunit ember-testing

我编写了这个简单的演示组件来演示一个问题。组件代码在

之下
App.FocusOutComponent = Em.Component.extend({
  attributeBindings: ['tabindex'],

  tagName: 'focus-out',

  setFocus: function() {
    console.log('clicked focus-out container');
    this.$().find('button').focus();
    console.log('focus set to button');
  }.on('click'),

  focussedOut: function() {
    console.log('focussedOut from outer container');
  }.on('focusOut'),
});

{{#focus-out id="focus-container" tabindex="-1"}}
  <button id="text-button">Test Button</button>
{{/focus-out}}

当我运行此命令并单击focus-out元素时,这是日志的顺序。的 Link to demo

  1. 点击焦点容器
  2. focussedOut from outer container
  3. 焦点设置为按钮
  4. 现在,当我尝试使用以下代码为此编写验收测试时。

    test('test visit / and click button', function() {
      expect(0);
      visit('/').then(function() {
        find('focus-out').click();
        console.log('after click in test');
      });
    });
    

    日志的顺序不同。 Link to demo

    1. 点击焦点容器
    2. 焦点设置为按钮
    3. 点击测试后
    4. focussedOut from outer container
    5. 最后打印focusOut日志,而不是在点击后日志之前。我期待日志的订单相同,最后只有一个额外的日志(点击后)。

      我不确定这是我的代码是错误还是错误。

      我还注意到执行测试时遇到了另一个问题。如果我在测试运行时专注于chrome dev-tools,则focusOut事件根本不会触发。

      非常感谢对此的一些帮助。

1 个答案:

答案 0 :(得分:2)

点击事件不会设置焦点(作为后门路线)。如果您想要相同的结果,则需要手动设置焦点然后单击。

Ember的Click Helper(发送mousedown / mouseup,然后点击)

function click(app, selector, context) {
  var $el = app.testHelpers.findWithAssert(selector, context);
  run($el, 'mousedown');

  if ($el.is(':input')) {
    var type = $el.prop('type');
    if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {
      run($el, function(){
        // Firefox does not trigger the `focusin` event if the window
        // does not have focus. If the document doesn't have focus just
        // use trigger('focusin') instead.
        if (!document.hasFocus || document.hasFocus()) {
          this.focus();
        } else {
          this.trigger('focusin');
        }
      });
    }
  }

  run($el, 'mouseup');
  run($el, 'click');

  return app.testHelpers.wait();
}

修改测试

test('test visit / and click button', function() {
  expect(0);
  visit('/').then(function() {
    var el = find('focus-out');
    el.focus();
    click(el);
    console.log('after click in test');
  });
});

http://emberjs.jsbin.com/lefazevozi/1/edit?js,console,output

同样重要的是要注意,拆除也会引发焦点事件。所以你看到焦点的主要原因是因为在拆解时它失去了按钮孩子的注意力。

也许焦点应该在mousedown之前设置在ember测试中的点击助手上,虽然我不确定还有什么可能会影响,或者人们通常不会期望这样,因为jquery没有&#39这样做。