我怎么能等待一个元素让孩子患上Geb?

时间:2014-12-04 15:57:04

标签: ajax spock geb

我正在执行一项运行功能性使用“点击添加”功能的测试。 为用户提供了一个项目表,允许他们单击“添加”按钮将项目添加到他们的购物车。

按钮执行ajax调用以将项目附加到用户的购物车。成功添加项目后,该项目将显示在购物车UI中。 Cart UI本质上是另一个表。

//pseudo code
$('.addButton').on('click', function (event) {
    $.ajax({
        url:...,
        success: updateCart
    });
});
function updateCart (data) {
    // use data to create tr_fragment
    $("#cart-ui-target").append(tr_fragment); //new row
}

我在then语句中尝试的是使用waitFor,直到#cart-ui-target的{​​{1}}大小大于或等于1:

<tr>

但是,每隔一段时间,测试就会失败并出现以下异常:

waitFor(5) {$('#cart-ui-target').find('tr').size() >= 1}

我甚至试图以2秒的间隔将waitFor时间增加到10秒,但它仍然不起作用:

geb.waiting.WaitTimeoutException: condition did not pass in 5.0 seconds (failed with exception)

我可以做些什么来使这更好地等待并防止零星的失败?

更新 这就是我在phantomjs的日志信息中看到的。

waitFor(10, 2) {$('#cart-ui-target').find('tr').size() >= 1}

1 个答案:

答案 0 :(得分:0)

我认为您试图测试JavaScript行为,而不是添加到购物车本身(可能是在后端逻辑中测试过的?)。

我认为要走的路是模拟$ .ajax并使用fixture数据从模拟中调用回调。如果您使用茉莉花,这可以看起来像这样:

it('should add something when something is succesfully addes', function() {
  data = 'data_for_callback_here';
  spyOn($, 'ajax').andCallFake(function(data) { data.success(data); } );
  $('.addButton').click();
  expect() // Expect something
});