【问题标题】:How to wait for Rest API to respond in Protractor如何在量角器中等待 Rest API 响应
【发布时间】:2016-07-01 23:16:34
【问题描述】:

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

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)
 });            
};

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

Common.CreateTenant('"tid": "1","long_name": "test tenant"');
Common.CreateUsers('"userName": "test1", "tenantKey": "1", "password": "Test1", "userID": "1"');

有什么方法可以等待每个 API 调用完成然后执行下一个调用?

【问题讨论】:

    标签: protractor


    【解决方案1】:

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

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

    几乎总是更好的方法是使用回调,在 API 调用完成时提醒您。

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

    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)
    
                //Create user once tenant has been successfully created
                Commons.CreateUsers('"userName": "test1", "tenantKey": "1", "password": "Test1", "userID": "1"');
    
    
            }
            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)
     });            
    };
    

    【讨论】:

    • 嗨@Nicholas Ackerman,我正在使用您在代码中建议的上述函数,但问题是request.post(CreateTenantUrl).set('Content-Type', 'application/json').set('serviceSharedSecret', 'sharedsecret').send(data).end(function(err,res) 需要时间来响应状态200,因此Commons.CreateUsers('"userName": "test1", "tenantKey": "1", "password": "Test1", "userID": "1"') 调用永远不会被执行。请建议我该如何等待,或者我还能做些什么。
    【解决方案2】:

    为了等待请求完成,您需要将其包装在一个 Promise 中。更多信息请见How to make superagent return a promise

    【讨论】:

      猜你喜欢
      • 2018-08-04
      • 1970-01-01
      • 2020-03-16
      • 2022-07-01
      • 2023-02-06
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多