量角器等待数据库连接

时间:2015-06-18 12:06:54

标签: angularjs protractor end-to-end

我在执行下面的测试之前尝试连接到我的数据库,似乎因为回调,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连接后进行断言?

1 个答案:

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