我在执行下面的测试之前尝试连接到我的数据库,似乎因为回调,Protractor不会等待数据库连接。这是我的代码:
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----
如何在db连接后进行断言?
答案 0 :(得分: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;
}