量角器查询SQL Server数据库(MSSQL)

时间:2017-03-22 12:20:57

标签: sql-server node.js selenium-webdriver protractor

我正在尝试在SQL Server上执行一个简单的查询,但是当我使用量角器运行它时,它只是快速运行并且不返回(记录)任何内容。我会感谢任何提示,工作示例或指向我做错的指示以及如何使用量角器在SQL Server上执行SQL查询。

var sql = require('mssql');

describe('test db connection', function () {

  it('tests db connection', function () {

    ConnectDB()

  })

  function ConnectDB() {

    var config = {
      user: 'user',
      password: 'password',
      server: 'xyz.database.windows.net',
      database: 'dbdev',

      options: {
        encrypt: true
      }
    }

    var connection = new sql.Connection(config)
    connection.connect(function (err) {
      console.log(err)
    })

    var request = new sql.Request(connection);
    request.query('select * from Config where [Key] like \'HidePreop%\'', function (err, recordeset) {
      var res = recordeset;
      console.log(res)
    });

5 个答案:

答案 0 :(得分:4)

量角器测试 - it块只等待Protractor控制流中的webDriverJS命令完成,以及您必须手动使it块等待done的任何其他异步活动。< / p>

在这种情况下 -

describe('test db connection', function () {    
    it('tests db connection', function (done) {
        // Any method that returns a promise. Similary if your method returns a callback you can handle accordingly
        ConnectDB().then(function _onSuccess(){
            done();
        }).catch(function _onFailure(err){
            done.fail(err);
        })
    })
});

我会修改你的功能 - ConnectDB()以根据mssql npm package提供的回调的分辨率返回一个承诺。 Refer here关于如何将回调转换为Promises。这是一个很棒的教程。

function ConnectDB() {
    return new Promise(function (fulfill, reject) {
        var config = {
            user: 'user',
            .............
        };
        var connection = new sql.Connection(config);
        connection.connect(function (err) {
            reject(err);
        });

        var request = new sql.Request(connection);
        request.query('select * from Config where [Key] like \'HidePreop%\'', function (err, recordeset) {
            if (err) reject(err);
            else fulfill(recordeset);
        });
    });
}

答案 1 :(得分:1)

我在其自己的文件中使用此配置访问MSSQL数据库,然后将其导入测试文件,因此我可以使用它有点像假的页面对象。 我强烈建议将任何数据库信息存储在存储库外部的外部文件中。我正在使用npm库dotenv中的.env文件,可以使用npm install --save-dev dotenv

进行安装
//db.js
const sql = require('mssql');

require('dotenv').config();

var config = {
  user: process.env.MSSQL_USERNAME,
  password: process.env.MSSQL_PASSWORD,
  server: process.env.MSSQL_SERVER,
  database: 'YOURDB',
  options: {
   encrypt: true
  }
};

module.exports = {

/** Define sql queries here  */
  deleteEmployeeByLastName(lastName) {
    let my_query = `DELETE FROM dbo.Employee WHERE LastName='${lastName}'`;
    sql.connect(config).then(function () {
      new sql.Request()
        .query(my_query).then(function (recordset) {}).catch(function (err) {
          console.log(err);
        });
    });
  }
}

测试文件看起来应该是这样的

//test.js
var db = require('db.js');

describe('Employee Management', function () {    

    it('Deleting an employee', function (done) {
       db.deleteEmployeeByLastName('Pmurt');
       //REST OF CODE HERE
       //...
       //...
       done();
    })
});

答案 2 :(得分:1)

以上都不适合我,然后我找到了此链接-https://www.tutorialsteacher.com/nodejs/access-sql-server-in-nodejs 我按照他们的建议 另外,我从链接中获取信息,将其放置在函数中,然后将函数放置在类中。

export class SqlDo {
  static serverDo() {

//链接中的信息

并在

之后添加了更多内容
var server = app.listen(5000, function () {
    console.log('Server is running..');

部分。 我添加了

browser.waitForAngularEnabled(false);
browser.get('http://localhost:5000');

,这会将输出添加到屏幕截图报告程序收集的屏幕截图中。 然后,我创建了一个规范,并在其中调用了class.function

import { SqlDo } from './server';

describe('', () => {
  it('test connection and output', () => {
    SqlDo.serverDo();
  });
});

所有这些都与渲染的数据库输出,屏幕截图以及html报告中捕获的屏幕截图一起使用。

我希望这能帮助仍然挣扎的人。

答案 3 :(得分:0)

发布mssql@4.0.4的工作示例

var sql = require('mssql');

describe('test db connection', function () {
it('tests db connection', function (done) {
    ConnectDB().then(function _onSuccess(_returned){
        console.log(_returned.recordset[0].FirstPSPOrderId)

        done();
    }).catch(function _onFailure(err){
        done.fail(err);
    })
})

});

function ConnectDB() {
    return new Promise(function (fulfill, reject) {
    var config = {
        user: 'xxx',
        password: 'xxx',
        server: 'xxx',
        port: 'xxx',
        database: 'xxxxxx',

        options: {
            encrypt: true
        }
};
    var connection = new sql.ConnectionPool(config);
    connection.connect((err) => {
        if (err) reject(err);

    //});

    let query = "select [FirstPSPOrderId] from XYZ"
    connection.request()
    .query(query, (err, recordeset) => {

        console.dir('Record set: ' + recordeset)
        console.dir('Err: ' + err)

        if (err) reject(err);
        else fulfill(recordeset);
    });
});

});

}

答案 4 :(得分:0)

基于异步/等待的更新答案:

package.json:

"devDependencies": {
    "@types/mssql": "4.0.11",
    "msnodesqlv8": "0.6.11",
    "mssql": "4.3.0",
}

测试:

import { ConnectionPool } from 'mssql/msnodesqlv8';

describe('any test', () => {

    it('should prepare db', async () => {
        const connectionString = 'Server=#server#;Database=#db#;Trusted_Connection=Yes;Driver=msnodesqlv8'

        const connectionPool: ConnectionPool = new ConnectionPool(connectionString);

        await connectionPool.connect();

        const result = await connectionPool.request().query('select 'Hello World' as resultColumn');

        connectionPool.close();

        expect(result.recordset[0].resultColumn).toEqual('Hello World');
    }

}

使用准备数据的sql语句替换查询。例如从用户删除... 然后使用result.affectedRows查看删除是否有效