Как решить эту гонку с нокаутом и капибарой?

У меня есть страница, отображающая поле со списком wijmo через нокаутную привязку wijcombobox ( http://wijmo.com/wiki/index.php/Using_Wijmo_with_Knockout ). У меня возникли трудности с тестированием этого с помощью капибары из-за состояния гонки между запущенными тестами и привязкой события щелчка. Возможно, есть и другие условия гонки, но это текущее меня сбивает с толку. Это то, что у меня есть в качестве текущего обходного пути:

def click_on_combobox_till_options_appear
  wait_until(10) do
    page.find('.wijmo-wijcombobox-trigger').click
    page.has_css?('.wijmo-wijlist-item')
  end
end

Я использую «kb-inject» для настройки привязок ViewModel.

Есть ли событие javascript, к которому я могу подключиться, или свойство, которое я могу проверить, чтобы указать, что applyBindings завершил выполнение, чтобы я мог избежать обходных путей, подобных приведенному выше?


person Ben Taitelbaum    schedule 01.11.2012    source источник
comment
Я тоже думал об этом, к сожалению, нет.   -  person Jeff Mercado    schedule 02.11.2012


Ответы (1)


Что касается ожидания вызова applyBindings, мы придумали следующий обходной путь. Это не очень хорошо, но должно послужить основой для решения подобных проблем (замените App пространством имен, которое имеет смысл):

def wait_for_ko_bindings
  js = <<END_JS
$(function() {
  ko.bindingHandlers.isLoadedForTests = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
      App.ko_bindings_loaded_for_tests = true;
    }
  };
  var viewModel = {};

  var testNode = document.createElement('div');
  testNode.innerHTML = '<div data-bind="isLoadedForTests:1"></div>';
  document.body.appendChild(testNode);
  kb.applyBindings(viewModel, testNode);
});
END_JS
  page.execute_script(js)
  wait_until do
    page.evaluate_script('App.ko_bindings_loaded_for_tests === true')
  end
end

В частности, для wijcombobox мы обнаружили, что работает следующее:

def click_combobox
  wait_until(10) do
    page.find('.wijmo-wijcombobox-trigger').click
    page.all('.wijmo-wijlist-item').length > 0
  end
end
person Ben Taitelbaum    schedule 02.11.2012