如何在Jasmine / Protractor中的promise中包装`AxeBuilder.analyse()`?

时间:2016-08-16 15:44:32

标签: asynchronous jasmine promise protractor

我一直在研究Jasmine自定义匹配器,以检查页面是否可访问。

重要的一点如下:

var _result = {};
AxeBuilder(browser.driver).analyze(function(results) {
    if (util.equals(results.violations.length, expected)) {
        _result.pass = true;
        _result.message = 'Selection was accessible.';
    } else {
        _result.pass = false;
        _result.message = results.violations;
    }
});
return result;

我遇到的问题是_result(不是results)总是一个空对象。

我怀疑问题是AxeBuilder(...).analyze(...)是异步但不返回承诺。

我的测试不是从Karma运行的,它是通过我的Protractor配置启动的。

如果我的怀疑是真的,我将如何将其包含在承诺中?

3 个答案:

答案 0 :(得分:2)

如果可能,您应该使用量角器

中提供的WebDriverJS承诺
function builder() {
      return AxeBuilder(browser.driver).analyze(function(results) {
         var deferred = protractor.promise.defer();
         if (util.equals(results.violations.length, expected)) {
           _result.pass = true;
           _result.message = 'Selection was accessible.';
           deferred.fulfill(_result);
         } else {
           _result.pass = false;
           _result.message = results.violations;
           deferred.reject(_result);
         }
         return deferred;
     });
}

以下是如何使用它,

 builder().then(function(_result) {
        console.log(_result.pass);
    }, function(err) {
       console.error(err);
 });

答案 1 :(得分:1)

您可以实现回调概念,以防止在结果对象准备好之前执行语句' 返回结果' 。您可以尝试使用以下代码。

 var _result = {firstvalue:"test"};
 AxeBuilder(browser.driver).analyze(function(results,callback) {
      if (util.equals(results.violations.length, expected)) {
           _result.pass = true;
           _result.message = 'Selection was accessible.';
       } else {
         _result.pass = false;
         _result.message = results.violations;
      }
     callback(result);
  });

var callback=function(result){
   return result;
  }

答案 2 :(得分:0)

我不熟悉AxeBuilder。正如你所提到的,AxeBuilder.analyze()是一个异步方法,你需要在analyze方法中返回_result变量。请尝试以下代码,

return AxeBuilder(browser.driver).analyze(function(results) {
  if (util.equals(results.violations.length, expected)) {
    _result.pass = true;
    _result.message = 'Selection was accessible.';
  } else {
    _result.pass = false;
    _result.message = results.violations;
  }
   return _result;
});

在代码中,您将在执行analyze方法之前返回_result变量。