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

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 に答える