使用Intern / Leadfoot进行功能测试条件

时间:2014-09-04 08:16:17

标签: selenium intern

我希望有条件地执行一些命令/断言,具体取决于先前的断言是否成功。

我似乎找不到使用leadfoot的链接语法来嵌套then调用或有条件地执行事物的方法。

这是我的测试(每个函数末尾的返回值是由于这是编译coffeescript):

tdd.test(tableUrl, function() {
    this.timeout = 60000;
    return this.remote.get(require.toUrl("tests/pages/" + tableUrl))
    .setPageLoadTimeout(60000)
    .setFindTimeout(20000)
    .findByCssSelector('.dataTables_wrapper table.dataTable')
    .then(null, function(err) {
      return assert.fail('', '', 'Table should exist');
    }).then(pollUntil(function() {
      var table;
      table = document.querySelector('.dataTables_wrapper table.dataTable');
      if (table.querySelectorAll('tbody td').length > 1) {
        return true;
      } else {
        return null;
      }
    }, null, 20000, 500)).then(function() {
      console.log('Assertion succeeded: Table should have data');
      return assert.ok(true, 'Table should have data');
    }, function(err) {
      return assert.fail('', '', 'Table should have data');
    });
  });

当表不存在时,“表应该存在”和“表应该有数据”断言应报告为失败。但是,只有最后一个断言失败。当我注释掉“表应该有数据”错误回调时,“表应该存在”断言被报告为正确失败。

我想做的是

  1. 测试是否存在table(通过findByCssSelector)。

    a)如果存在,请报告它存在并进行测试以确定它有多个td元素。这是通过pollUntil完成的,以确保一旦找到多个td而不是等待整个隐式等待时间,就会解决命令完成/保证。

    b)如果不存在,请报告它不存在。

  2. 由于缺少条件,如果第一个findByCssSelector失败,我似乎找不到执行第二个'表应该有数据'轮询的错误回调的方法并且只有在测试中报告的最后一个断言失败。

1 个答案:

答案 0 :(得分:3)

因此条件分支可以then次调用时发生,this answer解决了如何使用实习生进行条件分支。

我遇到的问题是由于pollUntilleadfoot Command函数的行为方式与普通function returning a callback function that returns a promise rather than a promise directly方法不同。

可以通过将pollUntil包装在匿名函数中,使用pollUntil方法立即调用call函数,传入当前this值来避免这种情况。 then设置回调到Command对象的上下文,然后最终链接另一个Command。

以上代码使用pollUntil使用正确的条件分支。

tdd.test(tableUrl, function() {
  this.timeout = 60000;
  return this.remote.get(require.toUrl("tests/pages/" + tableUrl))
  .setPageLoadTimeout(60000)
  .setFindTimeout(5000)
  .findByCssSelector('.dataTables_wrapper table.dataTable')
  .then((function() {
    return pollUntil(function() {
      var table;
      table = document.querySelector('.dataTables_wrapper table.dataTable');
      if (table.querySelectorAll('tbody td').length > 1) {
        return true;
      } else {
        return null;
      }
    }, null, 20000, 500).call(this).then(function() {
      console.log('Assertion succeeded: Table should have data');
      return assert.ok(true, 'Table should have data');
    }, function(err) {
      return assert.fail('', '', 'Table should have data');
    });
  }), function(err) {
    return assert.fail('', '', "Table should exist. Error: " + err.name);
  });
});