首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何为chai-http导出node express app

如何为chai-http导出node express app
EN

Stack Overflow用户
提问于 2019-03-15 13:11:54
回答 5查看 1.5K关注 0票数 8

我有一个带有几个端点的express应用程序,目前正在使用mocha、chai和chai-http对其进行测试。在我为池化mongo连接添加逻辑并开始构建依赖于DB连接的端点之前,这种方法工作得很好。基本上,在我导入我的API路由并启动应用程序之前,我想确保我已经连接到了mongo。

我的问题是,我在理解如何为chai-http导出我的应用程序时遇到了问题,但在测试任何端点之前,还要确保有一个DB连接。

在这里,我连接到mongo,然后在一个回调中应用我的API并启动应用程序。这个示例的问题是,我的测试将在建立到数据库的连接之前和定义任何端点之前开始。我可以将app.listenapi(app)移到MongoPool.connect()回调之外,但是我仍然有一个问题,即在测试运行时没有数据库连接,所以我的端点将失败。

server.js

代码语言:javascript
复制
import express from 'express';
import api from './api';
import MongoPool from './lib/MongoPool';
let app = express();
let port = process.env.PORT || 3000;
MongoPool.connect((err, success) => {
    if (err) throw err;
    if (success) {
        console.log("Connected to db.")
        // apply express router endpoints to app
        api(app);
        app.listen(port, () => {
            console.log(`App listening on port ${port}`);
        })
    } else {
        throw "Couldnt connect to db";
    }

})
export default app;

如何使用chai-http测试我的端点,同时确保在实际执行测试之前存在池连接?以一种符合我正在使用的测试的方式编写我的应用程序,感觉很脏。这是我的池实现的设计问题吗?有没有更好的方法用chai-http测试我的端点?

下面是我正在运行的测试

test.js

代码语言:javascript
复制
let chai = require('chai');
let chaiHttp = require('chai-http');
let server = require('../server').default;;
let should = chai.should();


chai.use(chaiHttp);
//Our parent block
describe('Forecast', () => {
/*
  * Test the /GET route
  */
  describe('/GET forecast', () => {
      it('it should GET the forecast', (done) => {
        chai.request(server)
            .get('/api/forecast?type=grid&lat=39.2667&long=-81.5615')
            .end((err, res) => {
                res.should.have.status(200);
              done();
            });
      });
  });

});

这是我正在测试的端点

/api/forecast.js

代码语言:javascript
复制
import express from 'express';
import MongoPool from '../lib/MongoPool';
let router = express.Router();
let db = MongoPool.db();

router.get('/forecast', (req, res) => {
    // do something with DB here
})

export default router;

感谢您的帮助

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-03-25 02:32:18

在收到一些很好的反馈后,我发现这个基于Gomzy's answerVikash Singh's answer的解决方案最适合我。

server.js中,我连接到mongo池,然后在express app上发出'ready‘事件。然后在测试中,我可以使用before()等待'ready‘事件在应用程序上发出。一旦发生这种情况,我就可以开始执行测试了。

server.js

代码语言:javascript
复制
import express from 'express';
import bodyParser from 'body-parser';
import MongoPool from './lib/MongoPool';
let app = express();
let port = process.env.PORT || 5000;
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

(async () => {
    await MongoPool.connect();
    console.log("Connected to db.");
    require('./api').default(app);
    app.listen(port, () => {
        console.log(`Listening on port ${port}.`)
        app.emit("ready");
    });
})();

export default app;

test.js

代码语言:javascript
复制
//Require the dev-dependencies
import chai from 'chai';
import chaiHttp from 'chai-http';
import server from '../src/server'; 
let should = chai.should();
chai.use(chaiHttp);

before(done => {
  server.on("ready", () => {
    done();
  })
})
describe('Forecast', () => {
  describe('/GET forecast', () => {
    it('it should GET the forecast', (done) => {
      chai.request(server)
          .get('/api/forecast?type=grid&lat=39.2667&long=-81.5615')
          .end((err, res) => {
              res.should.have.status(200);
            done();
          });
    });
  });

});
票数 4
EN

Stack Overflow用户

发布于 2019-03-20 13:53:32

Express app是EventEmitter的一个实例,因此我们可以轻松地订阅事件。也就是说,app可以监听“ready”事件。

您的server.js文件将如下所示,

代码语言:javascript
复制
import express from 'express';
import api from './api';
import MongoPool from './lib/MongoPool';
let app = express();
let port = process.env.PORT || 3000;

app.on('ready', function() {
  app.listen(3000, function() {
    console.log('app is ready');
  });
});

MongoPool.connect((err, success) => {
  if (err) throw err;
  if (success) {
    console.log('Connected to db.');
    // apply express router endpoints to app
    api(app);

    // All OK - fire (emit) a ready event.
    app.emit('ready');
  } else {
    throw 'Couldnt connect to db';
  }
});

export default app;
票数 2
EN

Stack Overflow用户

发布于 2019-03-19 16:28:35

在您的测试中,在函数之前使用,如下所示:

代码语言:javascript
复制
 describe('Forecast', () => {
  before(function(done){
   checkMongoPool(done); // this function should wait and ensure mongo connection is established.
  });
  it('/GET forecast', function(cb){
  // write test code here ...
  });
});

你可以在下面的方法中检查mongodb连接:

方法1:只需检查readyState属性-

代码语言:javascript
复制
mongoose.connection.readyState == 0; // not connected
mongoose.connection.readyState == 1; // connected`

方法2:使用事件

代码语言:javascript
复制
mongoose.connection.on('connected', function(){});
mongoose.connection.on('error', function(){});
mongoose.connection.on('disconnected', function(){});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55175924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档