在量角器

时间:2016-11-14 12:22:29

标签: asynchronous jasmine protractor

我有一个测试用例,我的代码向服务器发出请求并检查是否存在具有指定日期的文件名。由于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请求的地方,我传递了在get请求结束时调用的回调函数。问题,我认为是在我的代码从服务器获取数据之前,量角器完成了测试。如何强制量角器等待以便我可以检查返回的数据?我当前的解决方法是将get请求置于beforeEach中,并且似乎是量角器强制测试以等待它完成执行。

2 个答案:

答案 0 :(得分:3)

如果您希望控制流等待它,您需要使用Promise处理请求的结果:

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

答案 1 :(得分:2)

您可以使用browser.wait简化包装请求函数(返回承诺),例如

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

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