У меня есть файл js, который предоставляет некоторые операции с БД. Этот файл работает только с обещаниями, которые можно связать. Чтобы проверить этот класс, я использую асинхронную функцию.
Проблема в том, что всякий раз, когда я работаю с обещаниями внутри своей тестовой функции, функция it блокируется для всех последующих тестов.
Вот два примера:
'use strict'
const exec = require('child_process').exec
const path = require('path')
const request = require('request')
const expect = require('chai').expect
const createTableStatements = require('../data')
test()
async function test () {
await testGetUser()
console.info('1')
await testGetFaculties()
}
function testGetUser () {
return new Promise((resolve1) => {
describe('test get user', function () {
const db = require('../dbInterface')
it('test get user should be complete', function () {
db.dbFunctions.dropAll()
.then(onResolve => {
return db.dbFunctions.createTable(createTableStatements.createTableStatements.user)
}
)
.then(() => {
console.info('success create user table')
return db.dbFunctions.addUser('1', 'firstName', 'lastName', 'email')
})
.then(resolve => {
return db.dbFunctions.getUser('email', undefined)
})
.then(result => {
expect(result.toString().includes('dummy')).to.equal(false)
})
.then(resolve => {
return db.dbFunctions.dropAll()
})
.then(resolve => {
console.info('resolve')
resolve1()
})
.catch(err => console.info(err))
})
})
})
}
function testGetFaculties () {
return new Promise(resolve => {
describe('test get faculties', function () {
let db
before(function () {
db = require('../dbInterface')
})
console.info('displayed')
it('should work', function () {
console.info('locked')
expect(db.dbFunctions.getFaculties('hsa')).to.be.an('array').that.does.include('Science')
resolve()
})
})
})
}
И это результат
resolve
1
displayed
Как видите, console.info('locked') не обрабатывается.
На данный момент я понял, что эта проблема возникает только тогда, когда я вызываю expect в функции then. Но это необходимо для моих тестов.
Функция test () должна содержать намного больше тестов, только для этого вопроса я его сократил.
И для пояснения: если я тестирую только методы типа testGetFaculties (), которые не содержат внутри другой цепочки обещаний, он работает так, как должен.
Есть идеи, почему это так?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Скорее всего, console.info( 'locked' ); ничего не делает, потому что ваш предыдущий тестовый пример вообще не был завершен.
Записывать describe, it, before внутри обещания и содержать невозвращенные обещания - это то, чего вам не следует делать.
Намного лучший тестовый пример будет выглядеть так:
'use strict'
const exec = require('child_process').exec
const path = require('path')
const request = require('request')
const expect = require('chai').expect
const createTableStatements = require('../data')
// You use this in both test cases anyway
const db = require('../dbInterface');
describe('test get user', function () {
it('test get user should be complete', function () {
return db
// ^ returning promise will make sure that the test ends when the promise ends.
.dbFunctions
.dropAll()
.then(onResolve => { ... } )
...
)
} );
} );
describe('test get faculties', function () {
it('should work', function () {
return db
// ^ returning promise will make sure that the test ends when the promise ends.
.dbFunctions
.getFaculties('hsa')
.then( value => {
// ^ You actually need to test the value of the resolve promise
expect( value ).to.be.an('array').that.does.include('Science');
} )
} );
} );
Вы не представляете, как много я пытался работать с описанием только вместо вложенного обещанного, а возвращаемое обещание было тем, чего мне все время не хватало О_о Ты очень много!
Не используйте
new Promise(). stackoverflow.com/questions/23803743/…