如何在量角器中正确链接承诺

时间:2017-01-18 07:58:03

标签: angular promise protractor deferred

请考虑以下代码段:

        getApiEndpoints.billingCycle()
           .then(apiURL=>{
                return RestClient.doGet(apiURL);
            }).then(console.log(data))

在上面的代码段中,getApiEndpoints.billingCycle()RestClient.doGet(apiURL)都返回了承诺。上面的代码只是挂起Web驱动程序,以后随着超时错误而崩溃。

我在这里缺少什么?

更新:RestClient.doGet(apiURL)

function doGet(url){
var defer = Helper.getPromise().defer();
      request.get(url, (error, response, body) => {
        if (response&&(response.statusCode == 200 || response.statusCode == 201)) {
          defer.fulfill(JSON.parse(body));
        } else {
          defer.reject(error);
        }
        });
      return defer.promise;

}

我做了什么

let flow = browser.controlFlow();
           flow.execute(getApiEndpoints.billingCycle())
           .then((apiURL)=> console.log(apiURL))

让我Failed: fn is not a function错误...

2 个答案:

答案 0 :(得分:2)

  

失败:fn不是函数

您应该将函数传递给execute()(不要调用它):

flow.execute(getApiEndpoints.billingCycle)

或者,如果需要传递参数:

flow.execute(function () {
    return getApiEndpoints.billingCycle(param1, param2);
});

答案 1 :(得分:0)

量角器有自己的control flow of Promises,非-Webdriver承诺默认不链接

所以有两种方法可以解决这个问题。我个人更喜欢第二种方法,因为它利用了Protractor配置提供的选项。

  1. 在Protractor Control流程中插入非Web驱动程序的承诺。有关如何实现此目的的beautiful post

  2. 如果这与数据设置或执行的先决条件有关,我建议在conf.js

  3. onPrepare()部分添加它
      
        
    • 您可以通过将onPrepare设置为*文件名字符串来指定包含要运行的代码的文件。 onPrepare可以选择返回一个   承诺,*量角器将在继续之前等待   执行。如果*准备涉及任何,则可以使用   异步调用,例如与*浏览器交互。除此以外   量角器不能保证执行顺序*并且可以启动   准备结束前的测试。
    •   
     onPrepare: function() {
           return getApiEndpoints.billingCycle()
               .then(apiURL=>{
               return RestClient.doGet(apiURL)
       }).then(
           // Any value you want to set with API response. Some examples below
           browser.profile = data.user.name;  
           browser.params.password = data.user.password;    
    
           // Or else get the complete JSON onto global browser and use it through-out test case
           browser.apiresponse = data;
    
           )
        },