2016-11-14 28 views
2

我有一个测试用例,我的代码向服务器发出请求,并检查指定日期的文件名是否存在。由于GET请求是异步调用,因此在检查它是否为指定日期之前,如何确保从服务器获取文件名?在量角器中获取请求的异步调用

这里是我的代码摘录:

var re = new RInterface(); 
it('data show exists', function() { 
    target.each(function(ele){ 
     browser.actions().mouseMove(ele).perform();  

     re.get(function(result){     
      expect(result).toEqual(true); 
     }); 
    }); 
}); 

RInterface.js

var Service = function() { 
var serv = this; 
var uname = atob(settings.username); 
var pwd = atob(settings.password); 
var url = 'https://' + uname + ':' + pwd + '@' + settings.Url + '/' + settings.format + '/' + settings.period; 
var completeURL = url;  
var today = DateString(); 

serv.get = function(callback) { 
var dataStrAry = []; 
var count = 0; 

request(completeURL, function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
       var serverData = JSON.parse(body);     

       var split = serverData[serverData.length-1].Name.split(" "); 
       var target = split[split.length-1].split(".")[0]; 

       // Check if the file with current date is available 
       // If it is, then assume data is saved on the server 
       if(target == today) { 
        console.log("equal"); 
        callback(true);      
       } 
       else { 
        console.log("not equal"); 
        callback(false); 
       } 

      } 
      else { 
       console.log("errror call"); 
       callback(false); 
       return; 

      } 
     }); 

    }; 

所以,re.get是我做的GET请求到服务器,然后我通过回调函数被调用时请求结束。问题是,我认为在我的代码从服务器获取数据之前量角器完成了测试。如何强制量角器等待,以便我可以检查返回的数据?我目前的解决方法是把请求放在beforeEach里面,似乎量角器强制测试等待它完成执行。

回答

3

你需要的,如果你想控制流等待它来处理与无极您请求的结果:

var re = new RInterface(); 
it('data show exists', function() { 
    target.each(function(ele){ 
     browser.actions().mouseMove(ele).perform();  

     expect(re.get()).toEqual(true); 
    }); 
}); 
var Service = function() { 
    ... 
    this.get = function() { 
     var defer = protractor.promise.defer(); 
     ... 
     request(completeURL, function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
       var result = ... 
       defer.fulfill(result); 
      } else { 
       defer.reject(error); 
      } 
     }); 

     return defer.promise; 
    }; 
}; 
+0

工程就像一个魅力。谢谢! – user30646

2

您可以通过使用browser.wait使其更容易,只是包装的要求功能(返回承诺)如

browser.wait(request...).then(result => { 
// here continue execution with the result of the request 
} 

这将使浏览器等待您的承诺。