2016-11-14 27 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 
} 

這將使瀏覽器等待您的承諾。