Я пишу несколько тестов мокко, где я инициализирую базу данных postgress, используя knex в хуках beaforeEach()
, afterEach()
и after()
.
Вот пример теста:
const chai = require('chai');
const should = chai.should();
const knex = require('../../src/server/db/connection').knex;
describe('test01', function() {
beforeEach( async function() {
try {
await knex.migrate.rollback();
//await knex.migrate.latest();
} catch (err) {
throw err;
}
});
afterEach(async function() {
try {
await knex.migrate.rollback();
} catch (err) {
throw err;
}
});
after(async function() {
try {
await knex.destroy();
} catch (err) {
console.log(err);
throw err;
}
});
describe.only('check array', function() {
it('responds with matching records', async function() {
const users = [1, 2, 3, 4];
users.should.have.length(3);
});
});
});
Если я запускаю тест, как написано выше, он работает как положено.Он завершается с ошибкой и печатает ожидаемое сообщение:
test
1) check arrays
0 passing (167ms)
1 failing
1) test
check arrays:
AssertionError: expected [ 1, 2, 3, 4 ] to have a length of 3 but got 4
+ expected - actual
-4
+3
at Context.<anonymous> (test\unit\auth.test.js:120:23)
Но если я попытаюсь выполнить миграцию без коммитов строки await knex.migrate.latest()
, проверка не пройдёт в хуке after()
и не выведет сообщение об ошибке.Вывод следующий:
test
1) check arrays
0 passing (838ms)
1 failing
2) "after all" hook
Некоторые важные детали:
- Я на Windows 10
- knex миграции определенно работают, я вижу, таблицы былиправильно создан и удален.
- Я пытался разместить некоторые следы, но ни одна ошибка не обнаружена.Все перехваты завершены правильно.
- Я попытался запустить тот же код в Linux с помощью Docker, но результат точно такой же
- Я попытался использовать стиль .then () / done () вместоasync / await и результат идентичны.
Вот мой package.json:
{
"engines": {
"node": "10.7.0",
"npm": "6.2.0"
},},
"dependencies": {
"bcryptjs": "2.4.0",
"body-parser": "1.17.2",
"bookshelf": "0.14.2",
"bookshelf-modelbase": "2.10.4",
"cloudinary": "1.9.0",
"dateformat": "2.0.0",
"debug": "2.2.0",
"dotenv": "4.0.0",
"express": "4.13.4",
"express-jwt": "5.3.0",
"expressive-hrbac": "^1.0.1",
"fs-extra": "4.0.0",
"joi": "13.4.0",
"jsend": "1.0.2",
"jsonwebtoken": "7.4.1",
"knex": "0.16.3",
"morgan": "1.7.0",
"multer": "1.3.0",
"nunjucks": "2.4.2",
"passport": "0.3.2",
"passport-local": "1.0.0",
"passport-stub": "1.1.1",
"pg": "7.4.3",
},
"devDependencies": {
"chai": "4.2.0",
"chai-as-promised": "7.1.1",
"chai-http": "4.2.1",
"chai-jwt": "2.0.0",
"console.table": "^0.10.0",
"eslint": "5.2.0",
"gulp": "3.9.1",
"gulp-eslint": "4.0.0",
"gulp-jscs": "4.0.0",
"gulp-jshint": "2.0.1",
"gulp-nodemon": "2.1.0",
"gulp-plumber": "1.1.0",
"jshint": "2.9.3",
"jshint-stylish": "2.2.1",
"jwt-simple": "0.5.5",
"minimist": "^1.2.0",
"mocha": "5.2.0",
"mocha-eslint": "5.0.0",
"mocha-jscs": "5.0.1",
"mocha-jshint": "2.3.1",
"pg-format": "^1.0.4",
"run-sequence": "1.2.2",
"shelljs": "0.8.1",
"tiny-lr": "0.2.1"
},
}
Спасибо
РЕДАКТИРОВАТЬ 13 апреля 2019
После некоторой отладки я понял, что проблема в том, что mocha reporter обрабатывает трассировку стека, созданную при проверках chai.Мокко предполагает, что error.stack является строкой и в lib / reporters / base.js пытается разделить ее следующим образом:
// indent stack trace
stack = stack.replace(/^/gm, ' ');
Без строки await knex.migrate.latest()
, которая работает, потому что стек действительно является строкой,Это выглядит так:
at chai.request.post.end (test\integration\routes.user.test.js:152:27)
at Test.Request.callback (node_modules\superagent\lib\node\index.js:716:12)
at parser (node_modules\superagent\lib\node\index.js:916:18)
at IncomingMessage.res.on (node_modules\superagent\lib\node\parsers\json.js:19:7)
at endReadableNT (_stream_readable.js:1132:12)
at processTicksAndRejections (internal/process/next_tick.js:76:17)
Когда строка await knex.migrate.latest()
не закомментирована, стек преобразуется в массив и выглядит следующим образом:
[ CallSite {},
CallSite {},
CallSite {},
CallSite {},
CallSite {},
CallSite {},
CallSite {} ]
метод replace () выдает исключениевызывая проблему.Я полагаю, в более поздней версии mocha аналогичная обработка стека вызывает проблему