node.js - 确保 Express 应用程序在每次 Mocha 测试之前运行

标签 node.js express mongoose mocha.js superagent

我正在使用 ExpressJS、NodeJS、Mongoose 和 Mocha 开发 REST API。

问题是我有一个 app.coffee 文件,它负责设置 ExpressJS 并连接到 Mongoose。我设置的方式是先连接 Mongoose,如果连接成功,则启动 ExpressJS 应用程序。

问题是在设置 Mocha 时,我需要确保 app.coffee 中存在的 ExpressJS 应用程序在执行任何测试用例之前完全启动成功,包括所有异步代码。

为此,我创建了一个 test_helper.coffee 并将以下代码放入其中,但是,即使 app.coffee 中的代码尚未完全执行,测试用例也会开始执行,这实际上是有意义的:

before (done) ->
  require(__dirname + '/../src/app')
  done()

简而言之,我想确保在执行任何测试用例之前 ExpressJS 应用程序已完全完成设置。

我该怎么做?

最佳答案

我迟到了,但我发现为快速应用设置 mocha 测试套件的最佳方法是让我的 app.js 或 server.js 文件导出应用对象,如下所示:

var mongoose = require('mongoose');
var express = require('express');
require('express-mongoose');

var env = process.env.NODE_ENV || 'development';
var config = require('./config/config')[env];

var models = require('./app/models');
var middleware = require('./app/middleware');
var routes = require('./app/routes');

var app = express();

app.set('port', process.env.PORT || config.port || 3000);
app.set('views', __dirname + '/app/views');
app.set('view engine', 'jade');

// database
mongoose.connect(config.db);

// middleware
middleware(app);

// Application routes
routes(app);

app.listen(app.get('port'));
console.log('Express server listening on port ' + app.get('port'));

// export app so we can test it
exports = module.exports = app;

确保您的配置文件具有不同的环境,例如开发、测试、生产设置:

var path = require('path');
var rootPath = path.normalize(__dirname + '/..');

module.exports = {
  development: {
    db: 'mongodb://localhost/my_dev_db',
    port: 3000
  },
  test: {
    db: 'mongodb://localhost/my_test_db',
    port: 8888
  },
  production: {
    // ...
  }
}

然后在您的测试文件中,您可以继续并要求您的应用程序,它将连接到正确的数据库和正确的端口:

var should = require('chai').should();
var request = require('supertest');
var mongoose = require('mongoose');

var app = require('../app');
var agent = request.agent(app);

var User = mongoose.model('User');

    // get users
    describe('GET /api/users', function() {
      it('returns users as JSON', function(done) {
        agent
        .get('/api/users')
        .expect(200)
        .expect('Content-Type', /json/)
        .end(function(err, res) {
          if (err) return done(err);
          res.body.should.have.property('users').and.be.instanceof(Array);
          done();
        });
      });
    });

最后,要启动整个怪物,请将其包含在 package.json 中(确保在 devDependencies 中有 nodemon 和 mocha):

"scripts": {
    "start": "NODE_ENV=development ./node_modules/.bin/nodemon app.js",
    "test": "NODE_ENV=test ./node_modules/.bin/mocha --reporter spec test/**.js"
  }

现在您可以使用 npm test 启动您的测试套件,并使用 npm start 启动您的应用程序。

希望对您有所帮助! ps:我从这个惊人的例子中学到的大部分东西: https://github.com/madhums/node-express-mongoose-demo

关于node.js - 确保 Express 应用程序在每次 Mocha 测试之前运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18941736/

相关文章:

node.js - 堆使用在 PM2 中意味着什么

javascript - multi或upsert设置为true后,MongoDB不更新记录并且promise保持失败

node.js - 使用 Node 和 Express 4 进行基本 HTTP 身份验证

node.js - 使用 Express 和 Mongoose 进行 BasicAuth

javascript - 带有 node-express 的 underscore.js

node.js - 在外面使用answer .then()并在node js中的另一部分代码中使用

javascript -/page1/和/page2/显示相同 - Express

mongodb - Mongoose 查询匹配数组的文档,无论其元素顺序如何

node.js - 连接到 MongoDb Atlas 服务器时出错

javascript - 如何从 Controller 呈现两种类型的数据以在 node.js 中查看?