如何在Protractor中等待Rest API响应

时间:2016-06-28 21:30:28

标签: protractor

我使用以下函数在我的Protractor测试中调用API,有时API需要时间来响应。

public abstract class BaseView extends FXMLView {

    public static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("bundleName");

    public BaseView() {
        this.bundle = RESOURCE_BUNDLE;
    }

    public BaseView(ResourceBundle bundle) {
        this.bundle = bundle;
    }

}

在测试脚本中调用这些函数:

var request = require( "superagent" );
var PostUrl = browser.baseUrl + 'rest/1.0/dev/users';
var CreateTenantUrl = browser.baseUrl + 'rest/1.0/tenant';

exports.CreateTenant = function(body){  
 var data = '{' + body + '}';       
 request.post(CreateTenantUrl).set('Content-Type', 'application/json').set('serviceSharedSecret', 'sharedsecret').send(data).end(function(err,res){
        if(err){
            console.log("CreateTenant post error=  ", err )
        } else{
            console.log("CreateTenant post response = ", res.status)
        }
        expect(res.status).toEqual(200)
     });     
};

exports.CreateUsers = function(body){
  var data = '{' +body + '}';
   request.post( PostUrl ).set('Content-Type', 'application/json').send(data).end(function(err,res){
 if(err){
        console.log("CreateUsers post error= ", err )
    } else{
        console.log("CreateUsers post response = ", res.status)
    }
expect(res.status).toEqual(202)
 });            
};

有没有办法等待每个API调用完成然后执行下一个?

2 个答案:

答案 0 :(得分:1)

如果您需要第二个API调用仅在第一个API调用完成后触发,请在第一个API调用的回调方法中发送第二个API调用。

完成API调用的'等待'是非常糟糕的做法。不做的示例如下:发送一个API调用等待10秒,检查第一个调用是否完成,如果有,则发送第二个api调用,否则再等待10秒并重复该过程。

它几乎总是更好的方法是使用回调,在API调用完成时会发出警报。

对于您的示例,您应该执行以下操作:

var merge = require('merge-stream');
gulp.task('process-css-debug', function() {
     var first = gulp
        .src('src/**/app.scss')
        .pipe(gp.plumber())
        .pipe(gp.sass().on('error', gp.sass.logError))
        .pipe(gp.autoprefixer())
        .pipe(gp.rename('app.min.scss'))
        .pipe(gulp.dest('./app'));

     var second = gulp
        .src('src/**/app.inline.scss')
        .pipe(gp.plumber())
        .pipe(gp.sass().on('error', gp.sass.logError))
        .pipe(gp.autoprefixer())
        .pipe(gp.rename('app.inline.min.scss'))
        .pipe(gulp.dest('./app'));

     return merge(first, second);
});

答案 1 :(得分:0)

为了等待请求完成,您需要将其包含在promise中。有关详细信息,请参阅How to make superagent return a promise