首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node-mssql在运行Mocha测试时“连接已关闭”,但在应用程序中运行正常

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

Stack Overflow用户
提问于 2019-01-26 01:48:57
回答 2查看 263关注 0票数 0

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

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

节点-v v10.15.0

chai:"^4.2.0",mocha:"^5.2.0“mssql:"^4.3.0",

代码语言:javascript
复制
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

下面是我失败的mocha测试

代码语言:javascript
复制
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)
    })
})

我还尝试了使用完成回调的旧风格的异步mocha测试

代码语言:javascript
复制
it('is simple oldschool',  function (done) {
         data.simple()
        .then(function(yo){
            expect(yo).to.exist
            expect(yo).to.equal(1)
            done()
        })
    })

无论我设置Mocha的超时时间有多长,都会超时(我尝试了高达60秒)

我无计可施了,有没有人看到有什么问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-26 02:23:11

在实际连接完成之前,api.connect可以返回。像这样重写它将确保ConnectionPool.connect可以在api.connect promise解析之前完成。

代码语言:javascript
复制
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);
    });
  });

除此之外,我对let pool = await c3感到困惑;在您粘贴的代码中没有符号c3 ...

票数 2
EN

Stack Overflow用户

发布于 2019-01-26 02:15:25

我认为您的数据库连接存在竞争条件。

我在前面的()中这样做

代码语言:javascript
复制
before((done) => {
    server.on("serverStarted", function() {
         done();
    });
});

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

代码语言:javascript
复制
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);
    });
});

希望这能有所帮助。我在这件事上拔了几根头发。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54370443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档