2015-06-18 59 views
1

我试图在执行下面的测试之前连接到我的数据库,似乎是因为回调量角器不等待数据库连接。这里是我的代码:量角器等待数据库连接

describe('dashboard e2e test', function() { 
    var pg = require('pg'); 
    var conString = "****"; 
    var dbClient; 

    beforeEach(function() { 
    function connectToDB() { 
     console.log("----Connecting----"); 
     pg.connect(conString, function (err, client) { 
     var defer = protractor.promise.defer(); 
     if (!err) { 
      console.log("----Connected----"); 
      dbClient = client; 
      defer.fulfill(dbClient); 
     } else { 
      console.error('error fetching client from pool', err); 
      defer.reject(err); 
     } 

     return defer.promise; 
     }); 
    } 

    var flow = protractor.promise.controlFlow(); 
    flow.execute(connectToDB); 
    }); 

    it('should able to connect to db', function() { 
    console.log("----ittttt----"); 
    expect(dbClient !== undefined).toEqual(true); 
    }); 
}); 

这里是我的输出:

[launcher] Running 1 instances of WebDriver 
----Connecting---- 
----ittttt---- 
F 

Failures: 

    1) dashboard e2e test should able to connect to db 
    Message: 
    Expected false to equal true. 
    Stacktrace: 
    Error: Expected false to equal true. 

Finished in 0.037 seconds 
1 test, 1 assertion, 1 failure 

----Connected---- 

我怎样可以把它做数据库连接后的说法对吗?

回答

2

要处理量角器域以外的异步调用,最好坚持control-flow。从本质上讲,它是一个按照它们出现的顺序逐个解决的承诺队列。这就是Selenium如何确保它按照正确的顺序执行的动作和断言。它的美妙之处在于,您采用元素执行的每个操作都会自动对控制流程作出承诺。量角器补丁jasmine的expect功能也可以在控制流程上做出承诺,而不是立即尝试断言。现在

,为您的测试的东西可能看起来有点令人费解:

var pg = require('pg'); 
var conString = "****"; 
var dbClient; 

var connect = function() { 
    var prom = protractor.promise.defer(); 

    pg.connect(conString, function (err, client, done) { 
    if (!err) { 
     console.log("1"); 
     dbClient = client; 
     prom.fulfill(client); 
    } else { 
     return console.error('error fetching client from pool', err); 
    } 
    }); 

    return prom.promise; 
} 

var log2 = function() { 
    console.log(2); 
} 

describe('dashboard e2e test', function() { 

    it('should able to connect to db', function() { 
    var flow = browser.controlFlow();  
    flow.execute(connect);  
    flow.execute(log2);  
    }); 
});  

,但在现实世界中的场景,将最有可能是这样的:

describe('dashboard e2e test', function() { 
    it('should able to connect to db', function() { 
    var flow = browser.controlFlow();  

    #register the click function on the control-flow 
    element(by.css('some-button')).click(); 

    # wait for the click and do the db-operation 
    flow.execute(connect); 

    #wait for the db-operation above to finish and assert something 
    var warning = element(by.css('.warning')); 
    expect(warning.getText()).toContain('stuff'); 
    }); 
});  

关于你更新的问题,你几乎在那里:

function connectToDB() { 
    console.log("----Connecting----"); 
    var defer = protractor.promise.defer(); 
    pg.connect(conString, function (err, client) { 
    if (!err) { 
     console.log("----Connected----"); 
     dbClient = client; 
     defer.fulfill(dbClient); 
    } else { 
     console.error('error fetching client from pool', err); 
     defer.reject(err); 
    } 
    }); 

    return defer.promise; 
} 
+0

我该如何访问(在''函数中)fulfill参数'def.fulfil(data)'在这个ca中请参考'data' – vlio20

+0

请看我更新的问题 – vlio20