量角器等待数据库连接
Protractor wait for db connection
我正在尝试在执行以下测试之前连接到我的数据库,似乎由于回调 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----
如何让它在数据库连接后进行断言?
要处理量角器域外的异步调用,最好坚持 control-flow。从本质上讲,它是一个承诺队列,按照它们进入的顺序一个一个地解决。这就是 Selenium 工作的方式,以确保它以正确的顺序执行您传递给它的操作和断言。它的美妙之处在于,您对元素执行的每个操作都会自动对控制流做出承诺。 Protractor 修补了 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;
}
我正在尝试在执行以下测试之前连接到我的数据库,似乎由于回调 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----
如何让它在数据库连接后进行断言?
要处理量角器域外的异步调用,最好坚持 control-flow。从本质上讲,它是一个承诺队列,按照它们进入的顺序一个一个地解决。这就是 Selenium 工作的方式,以确保它以正确的顺序执行您传递给它的操作和断言。它的美妙之处在于,您对元素执行的每个操作都会自动对控制流做出承诺。 Protractor 修补了 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;
}