22

如何在 AngularJS 指令中测试焦点?我希望以下工作:

describe('focus test', function(){
    it('should focus element', function(){
        var element = $('<input type="text" />');
        // Append to body because otherwise it can't be foccused
        element.appendTo(document.body);
        element.focus();
        expect(element.is(':focus')).toBe(true);
    });
});

但是,这只适用于 IE,它在 Firefox 和 Chrome 中失败

更新:@S McCrohan 的解决方案有效。使用它我创建了一个“toHaveFocus”匹配器:

beforeEach(function(){
    this.addMatchers({
        toHaveFocus: function(){
            this.message = function(){
                return 'Expected \'' + angular.mock.dump(this.actual) + '\' to have focus';
            };

            return document.activeElement === this.actual[0];
        }
    });
});

使用如下:

expect(myElement).toHaveFocus();

请注意,对于焦点相关的测试,编译后的元素必须附加到 DOM,可以这样完成:

myElement.appendTo(document.body);
4

2 回答 2

10

尝试'document.activeElement'代替':focus'. 我没有在 karma 中测试过它,但$('document.activeElement')在标准 jQuery 下表现得如预期。

于 2013-12-17T23:58:31.563 回答
7

在 Jasmine 2 中,现在是:

beforeEach(function() {
  jasmine.addMatchers({
    toHaveFocus: function() {
      return {
        compare: function(actual) {
          return {
            pass: document.activeElement === actual[0]
          };
        }
      };
    }
  });
});
于 2014-04-17T03:50:29.067 回答