Я пытаюсь поймать Heisenbug.
Я обновляю наш проект с Ember CLI 0.2.0 и Ember 1.10.0 до Ember CLI 0.2.3 и Ember 1.11.1. Это был довольно безболезненный процесс, но у меня есть только один тест, который теперь терпит неудачу только в Safari (7.1.5). Он проходит в PhantomJS, Chrome и Firefox.
Досадно, что тест завершается с ошибкой только тогда, когда тестовый прогон инициируется Testem (то есть, когда изменение кода запускает тестовый прогон с автоматическим обновлением). Если я запускаю тесты из веб-интерфейса Qunit, они проходят. Обе эти вещи верны независимо от группировки тестов. Тестируемая функция прекрасно работает при ручном запуске в браузере.
Это интеграционный тест, который проверяет, что при изменении значения во входных данных вход обновляется значением, возвращенным с сервера. В тестах «сервер» — это экземпляр Pretender. Вот как выглядит сам тест:
test('Editing allocation cell', function() {
visit('/district/periods');
fillIn(SELECTORS.definitionRowInput(1,0), '100');
triggerEvent(SELECTORS.definitionRowInput(1,0), 'focusout');
// The triggerEvent should be tripping the focusOut event on a particular
// Ember.Textfield subclass, which subsequently leads to a POST request to
// the server. On Safari, however, the focusOut event isn't being called here.
// It is called elsewhere in the app, and it works in production.
// Things that also don't work: keyEvent(element, 'keypress', 16) (a tab),
// sending 'blur', sending 'focus-out'.
// 'focus-out' also fails in Firefox, 'blur' and tab fail in all 4 envs
andThen(function() {
equal($(SELECTORS.definitionRowInput(1,0)).val(), '90', 'The updated input takes the return value from the server (even if it is different from input)');
equal($(SELECTORS.gradeTotal(2)).text(), '120', 'Grade total updates with the new sum');
});
});
Обратите внимание на второй блок andThen()
: отправляя элементу управления focusout
, мы должны предлагать коду в компоненте поддержки обновить данные обратно на сервер. Другие браузеры делают это — я поставил console.log()
в ответчике Pretender, чтобы проверить это, — но Safari этого не делает. Я предполагаю, что он неправильно реагирует на событие focusout
.
Учитывая, что этот тест проходит в ветке, которая отличается только обновлением Ember CLI... что, вероятно, изменилось, чтобы сделать этот перерыв?
ETA: я по отдельности откатил все библиотеки, обновленные в этом обновлении, и тест продолжает давать сбой. Единственное изменение, которое, похоже, работает, — это откат самого Ember. Он ломается в 1.11.0 так же, как и 1.11.1, поэтому изменение происходит между 1.10.0 и 1.11.0. (Это оставляет мне только около 600 коммитов для просеивания...)
ETA2: я сузил диапазон между 1.11.0-beta.5 и 1.11.0. Я пытаюсь использовать bower link для используйте локальные сборки ember, но до сих пор сборки ember были ненадежными при выполнении тестов, и отношение этих двух тегов не такое, которое приводит к эффективное деление пополам.
Ember.run...
для одного этого вызова? - person jonathanKingston   schedule 15.04.2015triggerEvent()
звонка? Нет, об этом я не подумал - попробую. Спасибо! - person pjmorse   schedule 16.04.2015Ember.run.next
,Ember.run.later
илиEmber.run.once
. Это использовалось вокруг вызова триггера. Я думаю, что это может быть проблема с браузером, который не обрабатывает вызовы так синхронно, как они, возможно, должны быть. У меня никогда не было возможности отладить его достаточно, чтобы найти основную причину, но это повлияло на другие приложения, сафари, а также на мобильные браузеры, которые вели себя таким образом. - person jonathanKingston   schedule 16.04.2015