Миграция knex вызывает ранний тест на мокко - PullRequest
0 голосов
/ 05 апреля 2019

Я пишу несколько тестов мокко, где я инициализирую базу данных 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 аналогичная обработка стека вызывает проблему

...