Обновление Ember ломает один тест, и только в Safari

Я пытаюсь поймать 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 были ненадежными при выполнении тестов, и отношение этих двух тегов не такое, которое приводит к эффективное деление пополам.


person pjmorse    schedule 10.04.2015    source источник
comment
У меня были те же проблемы с testem при запуске в командной строке, я подозреваю, что это состояние гонки с разрешением промисов. Рассматривали ли вы возможность использования метода Ember.run... для одного этого вызова?   -  person jonathanKingston    schedule 15.04.2015
comment
Вокруг triggerEvent() звонка? Нет, об этом я не подумал - попробую. Спасибо!   -  person pjmorse    schedule 16.04.2015
comment
...Неа. Все еще там. Две вещи кажутся мне ключевыми: (1) есть довольно четкая пара из того, что это работает здесь, и это неработающие здесь теги в самом Ember, и (2) это влияет на Safari, но не на другие браузеры. Я ожидал бы, что в состоянии гонки он будет менее надежно воспроизводимым?   -  person pjmorse    schedule 16.04.2015
comment
Возможно, состояние гонки - неправильный термин, однако кажется, что это проблемы, связанные со временем, которые были похожи на то, как я решил свои проблемы с Ember.run.next, Ember.run.later или Ember.run.once. Это использовалось вокруг вызова триггера. Я думаю, что это может быть проблема с браузером, который не обрабатывает вызовы так синхронно, как они, возможно, должны быть. У меня никогда не было возможности отладить его достаточно, чтобы найти основную причину, но это повлияло на другие приложения, сафари, а также на мобильные браузеры, которые вели себя таким образом.   -  person jonathanKingston    schedule 16.04.2015


Ответы (1)


Я не могу помочь вам с запуском ваших тестов, но сгладить историю не так уж и сложно. Между упомянутыми вами тегами 49 патчей. Поток из git cherry-pick команд дает ветку, которую я загрузил на https://github.com/rdebath/test/tree/ember.js

Каждый из коммитов в этой ветке (после тега v1.11.0-beta.5) исходит из «хорошего» маршрута между упомянутыми вами тегами. Все хэши коммитов разные (очевидно), но окончательный хэш дерева такой же, как и в версии 1.11.0, так что это должен быть хороший путь для git bisect.

Проблем со сборкой также можно избежать, например, я бы предложил использовать bisect, чтобы найти патч, который их вызывает, и git rebase -i этот патч как можно позже. Это должно поставить проблему рядом с ее исправлением; но, вероятно, не стоит «раздавливать» эти коммиты, поскольку вы хотите иметь возможность связать все обратно с реальным деревом.

Чтобы помочь выбрать список коммитов, я использовал команду:

git log --graph --decorate --oneline --date-order --all

При этом «хороший» путь достаточно очевиден.

person user3710044    schedule 25.04.2015
comment
Это выглядит действительно полезным, спасибо. Я вернусь, когда у меня будет возможность попробовать. - person pjmorse; 26.04.2015
comment
К сожалению, сбои теста изменились, когда я переустанавливаю свою ветку обновления на более новую ветку разработки, поэтому я не могу убедиться, что это устраняет мою проблему. Но я думаю, что вы заслуживаете награды за то, что рассказали, как я могу разделить Эмбера пополам, чтобы выяснить, где все идет плохо. - person pjmorse; 01.05.2015