【问题标题】:Protractor ignores connection to DB via SSH量角器忽略通过 SSH 连接到数据库
【发布时间】:2018-04-08 20:49:38
【问题描述】:

我有下一个棘手的任务:我需要测试聊天,然后查询数据库并检查计费数据。

我们通过 SSH 连接使用 MySQL。 我找到了下一个可以使用的库: https://www.npmjs.com/package/mysql-ssh

我试过了,效果很好。 我用node test.js 运行它 但是当我尝试在我的规范中设置它时,我在console.log 中什么也看不到,即使我将 SQL 查询更改为无效,规范也总是成功运行:

it('Log in with common form and filled params', function () {
    /*var browser2 = browser.forkNewDriverInstance();
    browser2.ignoreSynchronization = true;
    browser.get(browser.baseUrl);
    browser2.get(browser.baseUrl);

    browser.pause();
    browser2.pause();*/


    mysqlssh.connect(
        {
            host: 'host',
            user: 'user',
            privateKey: fs.readFileSync('path to key')
        },
        {
            host: 'host',
            user: 'user',
            password: 'pass',
            database: 'db'
        }
    ).
        .then(client => {
            client.query('SELECT * FROM `agency`', function (err, results) {
                if (err) throw err;
                console.log(results);
                mysqlssh.close()
            })
        })
        .catch(err => {
            console.log(err)
        });
});

我不知道如何改变它。 唯一的解决方法是使用 Selenium 驱动程序创建一个测试并使用 Node 运行它,但这是一项额外的工作。

【问题讨论】:

    标签: mysql node.js selenium ssh protractor


    【解决方案1】:

    你需要使用 done()

    您需要使用done 函数做一些事情。请参阅jasmine documentation

    it('Log in with common form and filled params', (done) => {
        /*var browser2 = browser.forkNewDriverInstance();
        browser2.ignoreSynchronization = true;
        browser.get(browser.baseUrl);
        browser2.get(browser.baseUrl);
    
        browser.pause();
        browser2.pause();*/
    
    
        mysqlssh.connect(
            {
                host: 'host',
                user: 'user',
                privateKey: fs.readFileSync('path to key')
            },
            {
                host: 'host',
                user: 'user',
                password: 'pass',
                database: 'db'
            }
        ).
            .then(client => {
                client.query('SELECT * FROM `agency`', function (err, results) {
                    if (err) {
                      // if this is not caught, maybe use done.fail instead.
                      throw err; 
                    }
                    console.log(results);
                    mysqlssh.close();
                    done();
                });
            })
            .catch(err => {
                console.log(err);
                done.fail('some message');
            });
    });
    

    您需要在异步任务中提供 done 或 done.fail 方法,以便 Jasmine 等待此规范结束,然后再继续下一个规范。

    调试

    查看 mysql-ssh 的依赖关系,它使用了一个 Promise 包装器。 https://github.com/sidorares/node-mysql2/blob/master/documentation/Promise-Wrapper.md。但是,在查看 node-mysql2 存储库后,不清楚这些是异步的还是同步的。

    添加额外的日志记录:

    mysqlssh.connect({ host: 'host', user: 'user', privateKey: fs.readFileSync('path to key')},
            { host: 'host', user: 'user', password: 'pass', database: 'db' }
        ).then(client => {
            console.log('connected');
            console.log(client);
            client.query('SELECT * FROM `agency`', (err, results, fields) => {
              // should try to catch errors, also should validate if
              // the query returns a promise or not
              // if query returns a promise, there should be a then to close and a catch for errors
              // should pick a reasonable place to add a done
              // and done.fail calls.
    
            });
    
        }).catch(err => {
            console.log('error caught');
            done.fail();
        });
    

    【讨论】:

    • done() 对于量角器不是必需的。但是用 done() 什么都没有发生。
    • 其实在这种情况下是这样的。 selenium webdriver 承诺已同步,但 selenium 不知道此承诺,因为它不是控制流的一部分。
    • 非常感谢!它有效,但现在我有 TypeError: client.query(...).then 不是函数。也许我应该添加一些带有要求的包?你能帮帮我吗?
    • 好吧我调试错了,查询签名是字符串和回调函数。我会检查这些库是同步的还是异步的。我知道 Protractor,但我不是这个(mysql-ssh)库的专家。
    猜你喜欢
    • 1970-01-01
    • 2013-08-06
    • 2014-07-20
    • 2021-10-03
    • 1970-01-01
    • 2017-04-25
    • 2020-10-15
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多