我怎样用淘汰赛和水豚来解决这种竞争状况?

时间:2012-11-01 19:59:09

标签: knockout.js capybara wijmo knockback.js

我有一个页面通过wijcombobox敲除绑定(http://wijmo.com/wiki/index.php/Using_Wijmo_with_Knockout)呈现wijmo组合框。由于测试运行和点击事件之间的竞争条件,我使用水豚进行测试时遇到了困难。可能还有其他竞争条件,但这是目前的一个让我失望的原因。这就是我目前的解决方法:

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已完成执行,以便我可以避免像上面那样的变通方法?

1 个答案:

答案 0 :(得分:0)

在等待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