node-mssql "соединение закрыто" при запуске теста Mocha, но нормально работает в приложении - PullRequest
0 голосов
/ 25 января 2019

У меня есть приложение для обработки данных 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)
    })
})

Я такжепробовал старый стиль асинхронных тестов mocha с использованием обратных вызовов done ala

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

Это время вне зависимости от того, как долго я установил тайм-аут Mocha для (я пробовал до 60 секунд)

I 'Я в конце остроумие, кто-нибудь видит что-то не так?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

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);
    });
  });

Помимо этого, я запутался насчет let pool = await c3; в вставленном вами коде нет символа c3 ...

0 голосов
/ 25 января 2019

Я думаю, что у вас есть состояние гонки с подключением к базе данных.

Я делаю это в 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);
    });
});

Надеюсь, это помогает.Я вытащил немного волос на этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...