Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

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

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

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

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

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