运行Mocha测试时,node-mssql“连接已关闭”,但在应用程序中运行良好

时间:2019-01-25 17:48:57

标签: node.js async-await mocha node-mssql

我有一个node.js数据处理应用程序,可以从mssql中提取一些数据。它运行良好并产生预期的结果。但是,集成测试无法正常工作,我希望它们能够进行。

下面是连接管理和测试查询功能。从连接调试器的输出和运行中可以看到,在数据库连接之前测试已经运行并且失败了。因此,我的Mocha异步设置似乎无法正常运行,但看起来像我在文档中看到的所有内容。

节点-v v10.15.0

chai:“ ^ 4.2.0”, 摩卡:“ ^ 5.2.0” mssql:“ ^ 4.3.0”,

const config = require('./config')
const _ = require('underscore')
const sql = require('mssql')

sql.on('error', err => {
    console.error('SQL Error', err)
})

let api = {}

api.connect = async dbConfig => {
    return new sql.ConnectionPool(dbConfig).connect(
        err => {
            if (err)
                console.error('Connection error', err)
            else
                console.log('connected')
        })
}

var connecting = api.connect(config.sql)

api.simple = async () => {
    let pool = await connecting
    let result = await pool.request().query('select 1 as number')
    return result.recordset[0].number
}

module.exports = api

这是我的摩卡咖啡测试失败了

const { expect } = require('chai')
const data = require('../src/data')

describe('data access', function () {

    it('is simple', async function () {
        const yo = await data.simple()
        expect(yo).to.exist
        expect(yo).to.equal(1)
    })
})

我还使用完成的回调ala尝试了较旧的异步摩卡测试样式

it('is simple oldschool',  function (done) {
         data.simple()
        .then(function(yo){
            expect(yo).to.exist
            expect(yo).to.equal(1)
            done()
        })
    })

无论我将Mocha的超时时间设置为多长时间(我尝试长达60秒),该时间都会超时

我的智慧到此为止,有人看到什么不对吗?

2 个答案:

答案 0 :(得分:2)

我认为您的数据库连接存在竞争状况。

我在before()

before((done) => {
    server.on("serverStarted", function() {
         done();
    });
});

然后在我的服务器(我正在使用节点)中,当我连接时发出:

var port = process.env.PORT || 3030;
var server = http.listen(port, function(){
    console.log('listening on port: ' + port);
    db.connect().then(() => {
        console.log("Connect to database successful");
        server.emit("serverStarted") // HERE IT IS
    }).catch(err => {
        console.error(err);
        console.log("Cannot connect to database");
        process.exit(1);
    });
});

希望这会有所帮助。我在这根头发上拔了一些头发。

答案 1 :(得分:2)

PUTN()可以在实际完成连接之前返回。像这样重写它可以确保char_result = putn(test,'comma10.2'); api.connect承诺解决之前可以完成。

ConnectionPool.connect

除此之外,我对api.connect感到困惑;您粘贴的代码中没有符号api.connect = dbConfig => new Promise((resolve, reject) => { const pool = new sql.ConnectionPool(dbConfig); pool.connect(err => { if (err) { console.error("Connection error", err); return reject(err); } return resolve(pool); }); }); ...