【问题标题】:How to setup Mocha test file to avoid Sequelize loading errors?如何设置 Mocha 测试文件以避免 Sequelize 加载错误?
【发布时间】:2016-11-06 07:51:47
【问题描述】:

未处理的拒绝 SequelizeDatabaseError: SQLITE_ERROR: no such table: servings 是我在运行测试时收到的错误。

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 以便它等到数据库加载?

我已经搜索过,但似乎只有猫鼬特定的东西,而且我正在使用 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();
      });
    });

【问题讨论】:

  • 如果您自己解决了问题+认为它可能对其他人有用,您也应该创建答案。不要包括回答你的问题!
  • 如果您认为它对其他人没有用处,请删除问题以减少 SO 上的噪音。

标签: node.js express mocha.js


【解决方案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');
            });
        });

然后在 testfile 中测试之前执行此操作。

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

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 2018-01-21
    • 2016-08-22
    • 2019-06-25
    • 1970-01-01
    • 2014-01-20
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多