如何在Protractor中创建和操作Promise?

34

我想使用Node Http模块直接调用我的服务器来设置我的 Protractor 测试。Http 是基于回调的,我想将其转换为 promises。

例如,我希望这个函数返回一个 promise:

function callMyApi() {
  var promise = // somehow create promise;

  http.request({path: '/yada/yada', method: 'POST'}, function(resp) {
    promise.complete(resp);
  });

  return promise;
}
所以,问题是:我需要使用什么require()并替换“somehow create promise”才能使其正常工作?
2个回答

59

4
谢谢!这很有帮助。将它加到 https://github.com/angular/protractor/blob/master/docs/api.md 的 API 页面上怎么样? - Konrad Garus
1
我正在创建一个返回Promise的函数,如何在Protractor中解决/拒绝? - Paul Preibisch
4
您可以使用 deferred.fulfill(result)deferred.reject(reason) 来解决 / 拒绝延迟对象。 - hughes

2

这种做法是错误的,但了解Protractor控制流可能会有所帮助。如果您想让普通的Javascript按照Protractor的顺序运行,则通过控制流添加它。

在这种情况下,如果您想使用自己的promise库,那么只需使用browser.wait等待promise完成即可。

var Promise = require('bluebird');
var promises = [];
browser.controlFlow().execute(function() {
    var p = new Promise...
    promises.push(p);
});
browser.wait( function(){ return Promise.all(promises); }, timeoutMs );

我使用这个功能不是用于常规的承诺,而是用于console.log语句或者对测试的某一部分进行计时,甚至使用fs将测试结果输出到文件中。

var startTime, duration; 
browser.controlFlow().execute(function() {
    startTime = new Date().getTime();
});
//Protractor code you want timed
browser.controlFlow().execute(function() {
    duration = new Date().getTime() - startTime;
    console.log("Duration:", duration);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接