Как проверить, сфокусировано ли поле формы ввода?

Для следующей формы регистрации я настроил, чтобы первое поле ввода с id="signUpName" было сфокусировано при отображении формы. Для создания формы используется Backbone-forms.

Форма входа

Я хочу проверить с помощью Jasmine v.1.3.0, может ли определенная форма ввода поле фокусируется, когда я загружаю представление:

it("should focus the name field of the sign-up form", function() {
  var signUpName = userController.loginView.signUpForm.$el.find("#signUpName");
  userController.loginView.showSignUpForm();
  expect(signUpName).toBeFocused();
  // expect(signUpName.is(":focus")).toBe(true);
});

Жасмин предлагает:

Expected '<input id="signUpName" name="signUpName" type="text">' to be focused.

Как видно из спецификации, я использую сопоставитель toBeFocused() из jasmine-jquery. Я использую последнюю версию расширения 1.5.93. Я также нашел обсуждение реализации toBeFocused() и заметил, что они тем временем изменили его на альтернативная реализация, предложенная Райаном Гринбергом.

В качестве альтернативы я попытался отследить событие focus — есть ли оно на самом деле?

it("should focus the name field of the sign-up form", function() {
  var signUpName = userController.loginView.signUpForm.$el.find("#signUpName");
  var spyEvent = spyOnEvent(signUpName, 'focus');
  userController.loginView.showSignUpForm();;
  expect('focus').toHaveBeenTriggeredOn(signUpName);
  expect(spyEvent).toHaveBeenTriggered();
});

Жасмин предлагает:

Expected event focus to have been triggered on [object Object]

person JJD    schedule 13.12.2013    source источник
comment
stackoverflow .com/questions/967096/   -  person skos    schedule 13.12.2013
comment
@SachynKosare Я уже читал эту ветку, как вы могли догадаться по незакомментированной строке в моей спецификации. Тем не менее я понятия не имею, почему тест терпит неудачу.   -  person JJD    schedule 13.12.2013


Ответы (1)


Мы столкнулись с аналогичной проблемой в MindMup, где проблема заключалась в том, что фокус срабатывал не на этом конкретном объекте, а на другом селекторе jQuery, который соответствовал этому объекту. Мы написали несколько сопоставителей для Jasmine, которые проверяют, действительно ли событие было инициировано для эквивалентного набора элементов DOM jQuery. См. https://github.com/mindmup/mapjs/blob/master/test-lib/jquery-extension-matchers.js

При этом вы можете сделать:

spyOn(jQuery.fn, 'focus').and.callThrough();
// your test
expect(jQuery.fn.focus).toHaveBeenCalledOnJQueryObject(yourObject);
person Gojko Adzic    schedule 18.05.2015