如何设置Mocha测试文件以避免Sequelize加载错误?

时间:2016-11-06 07:51:48

标签: node.js express mocha

未处理的拒绝SequelizeDatabaseError:SQLITE_ERROR:没有这样的表:服务是我在运行测试时收到的错误。

routes.js

db.food.create(body).then(food => {
  db.serving.create({portion, description}).then(serving => {
    food.addServings(serving).then( () => {
      return food.reload();
    }).then( () => {
      res.json(food);
    });
  });
}, e => {
  res.status(400).json(e);
});

server.test.js

    const should = require('chai').should();
    const expect = require('chai').expect;
    const supertest = require('supertest');

    const {app} = require('./../server.js');

    describe('Food', () => {
      describe('POST /foods', () => {
        it('should create a new food', (done) => {
         const egg = {
        "portion": 50,
        "name": "large egg",
        "description": "large egg",
        "calories": 80,
        "protein": 8,
        "carbs": 0,
        "fat": 3
      };

  supertest(app)
    .post('/foods')
    .send(egg)
    .expect(200)
    .end((err, res) => {
      if (err) {
        return done(err);
      }

      expect(res.body).to.be.an('object');
      expect(res.body).to.have.property('carbs');
      expect(res.body).to.not.have.property('portion');
      done();
    });
});

server.js

    db.sequelize.sync({force: true}).then(function() {
        app.listen(port, function() {
            console.log(`Express running on port# ${port}`);
        });
    });

    let routes = require('./routes')(app, db);

    module.exports = {app};

我认为问题出现是因为express和数据库在测试开始运行时没有加载。后续测试很好,它只是第一个没有正确写入数据库的测试。

有没有办法可以更改测试文件或我的server.js,以便它等到数据库加载?

我搜索过,但似乎只有mongoose特定的东西,我正在使用sequelize。

编辑 - 解决了

    db.sequelize.sync({force: true}).then(function() {
        app.listen(port, function() {
            console.log(`Express running on port# ${port}`);

            let routes = require('./routes')(app, db);


            app.emit('serverStarted');
        });
    });

然后在测试前做这个。

    before(done => {
      app.on('serverStarted', () => {
        done();
      });
    });

1 个答案:

答案 0 :(得分:1)

<强> server.js

        db.sequelize.sync({force: true}).then(function() {
            app.listen(port, function() {
                console.log(`Express running on port# ${port}`);

                let routes = require('./routes')(app, db);


                app.emit('serverStarted');
            });
        });

然后在测试文件中进行测试之前执行此操作。

before(done => {
  app.on('serverStarted', () => {
    done();
  });
});