Тестирование фокуса директивы AngularJS

Как вы можете проверить фокус в директиве 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);

Ответы

Ответ 1

Попробуйте 'document.activeElement' вместо ':focus'. Я не тестировал его в карме, но $('document.activeElement') ведет себя по желанию в стандартном jQuery.

Ответ 2

В Жасмине 2 это теперь:

beforeEach(function() {
  jasmine.addMatchers({
    toHaveFocus: function() {
      return {
        compare: function(actual) {
          return {
            pass: document.activeElement === actual[0]
          };
        }
      };
    }
  });
});