Модель sailsjs не делает окончание мокко или шутки - PullRequest
1 голос
/ 24 сентября 2019

Я работаю над сборкой веб-API с использованием sailsjs и сиквелизирую как ORM вместо Waterline.Я начинаю писать тест для API, используя mocha, chai и chaijs.Мне нужно удалить все данные, созданные во время теста после завершения всех тестов, но когда я использую модель для сброса данных в хук after (afterAll в шутку), выполнение теста не завершается.

Вот код:

// set environement to test, to use test configuration
process.env.NODE_ENV = 'test'

const sails = require('sails');
const chai = require('chai');
const expect = chai.expect;
const chaiHttp = require('chai-http');

chai.use(chaiHttp);

let server;

// Before running any tests...
before(function(done) {
  const wait = 10000;
  console.log(`wait ${wait / 1000}sec. until sails complete loads...`);

  // Increase the Mocha timeout so that Sails has enough time to lift, even if you have a bunch of assets.
  this.timeout(wait);

  sails.lift({
    // Your Sails app's configuration files will be loaded automatically,
    // but you can also specify any other special overrides here for testing purposes.

    // For example, we might want to skip the Grunt hook,
    // and disable all logs except errors and warnings:
    // hooks: { grunt: false },
    hooks: {
      "blueprints": false,
      "orm": false,
      "pubsub": false,
      "grunt" : false
    },
    log: { level: 'warn' },

  }, function(err) {
    if (err) return done(err);

    server = sails.hooks.http.app;

    // here you can load fixtures, etc.
    // (for example, you might want to create some records in the database)

    return done();
  });
});

after(async function() {
    const wait = 10000; // 10 seconds
    this.timeout(wait);

    try {
        await sails.models.user.destroy({
            where: {},
            force: true
          });
      } catch (err) {
        return Promise.reject(err);
      }

    return sails.lower();
  });

describe('#Auth Controller - Register', () => {
  it('/signup has no GET method', function(done) {
    chai.request(server)
      .get('/auth/signup')
      .end(function (err, res) {
        if (err) done(err);

        expect(res).to.has.property('status');
        expect(res.status).to.equal(404);
        done();
     });
  });

  it('/signup response code expected to not equal "200", when request body is empty', function(done) {
    chai.request(server)
      .post('/auth/signup')
      .end(function (err, res) {
        if (err) done(err);

        expect(res).to.has.property('status');
        expect(res.status).to.not.equal(200);
        done();
     });
  });

  it('/signup expected to respond with error, when request body is empty', function(done) {
    chai.request(server)
      .post('/auth/signup')
      .end(function (err, res) {
        if (err) done(err);

        expect(res.body).to.has.property('status');
        expect(res.body.status).to.equal('error');
        done();
     });
  });
});

Я попытался jest запустить тест и изменил необходимые изменения до и после.и вот ловушка afterAll:

afterAll(async function() {
    try {
      await sails.models.user.destroy({
          where: {},
          force: true
        });
    } catch (err) {
      return Promise.reject(err);
    }

    return sails.lower();
});

шут тоже не заканчивается.и он печатает это журнал

Jest did not exit one second after the test run has completed.

This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with `--detectOpenHandles` to troubleshoot this issue
e.

Я использовал --detectOpenHandles вариант с шуткой, но ничего не произошло.Поэтому я попытался удалить вызов БД и изменил его другим обещанием, подобным следующему, и оно сработало, как и ожидалось, и mocha (и jest) прервались.

after(async function() {
    const wait = 10000; // 10 seconds
    this.timeout(wait);

    await new Promise(resolve => {
      const fn = function timeoutCb() {
        console.log('\n\nfrom time out\n\n');
        resolve();
      };

      setTimeout(fn, 0)
    });

    return sails.lower();
  });

Затем, чтобы убедиться, что sailsjs успешно опустился,Я добавляю к нему функцию обратного вызова.

after(async function() {
    const wait = 10000; // 10 seconds
    this.timeout(wait);

    try {
        await sails.models.user.destroy({
            where: {},
            force: true
          });
      } catch (err) {
        return Promise.reject(err);
      }

    const cb = (err) => {
        if (err) console.err('sails does not exit:\n', err);
        else console.log('tests are done.');
      };

    return sails.lower(cb);
});

Когда тест заканчивается, tests are done. печатает в терминале, а когда я использую Jest, он печатает

●  Cannot log after tests are done. Did you forget to wait for something async in your test?
    Attempted to log "tests are done.".

Мои версии среды и инструментов:

OS: (GNU/Linux) fedora 30
node: 10.16.1
npm: 6.11.3
sailsjs: 1.1.0
sails-hook-sequelize: 1.2.0
sequelize: 4.38.0
mocha: 6.2.0
jest: 24.9.0
chai: 4.2.0
chai-http: 4.3.0
...