当mongo中不存在集合时,mongoose模型保存不会触发回调并传递给chai-http

时间:2017-03-20 23:07:40

标签: mongodb mongoose mocha chai chai-http

我创建一个post api并使用mongoose模型将请求数据保存到数据库。然后我用邮递员来测试这个API。一切正常。一切正常我的意思是集合创建,数据保存到集合,并从响应中获取数据。请参阅以下代码

    const eSchema = new mongoose.Schema({
      model: String,
      year: Number,
      price: Number
    });

    const eModel = mongoose.model('bmw', eSchema);

    app.post('/api/bmw', (req, res) => {
      const newRecord = new eModel(req.body);
      newRecord.save((error, record) => {
        res.status(201).send(record);
      });
    });

然后我尝试将测试添加到此API。我用chai-http的mocha。请参阅以下代码

    let chai = require('chai');
    const chaiHttp = require('chai-http');
    chai.use(chaiHttp);

    it('POST /api/bmw', () => {
      chai
      .request(app)
      .post('/api/bmw')
      .send({ model: '440i', year: 2018, price: 85000 })
      .end((error, res) => {
        console.log('POST', res.body);
      });
    });

Step1:删除数据库(没有数据库,没有集合)

步骤2:我使用mocha path-to-test-file --timeout 20000

运行测试

步骤3:重复步骤2

在第2步之后,我没有看到任何记录的数据(console.log('POST',res.body))。但是,已创建集合并已将数据保存到mongo数据库。

在第3步之后,我确实看到了记录的数据。我假设因为该集合已经存在于mongo基础上的step2。

然后我再往前走一步。我从第1步重复到第3步。但是这次我在模型中保存回调的日志,然后我意识到在step2之后也没有调用回调。但如果我使用邮递员而不是chai-http,它每次都有效。

有没有人有同样的问题?这是mongoose模型和chai-http之间的能力问题吗?我错过了设置或其他什么吗?

就我个人而言,无论mongo中是否存在集合,我认为它都应该有效。

1 个答案:

答案 0 :(得分:1)

api send是一个异步请求。您需要将done函数传递到it()块以标记完成...如下所示:

let chai = require('chai');
const chaiHttp = require('chai-http');
chai.use(chaiHttp);

it('POST /api/bmw', (done) => {
  chai
  .request(app)
  .post('/api/bmw')
  .send({ model: '440i', year: 2018, price: 85000 })
  .end((error, res) => {
    if(error) done(error)
    else{
      console.log('POST', res.body);
      done();
    }
  });
});