node.js - 测试快速应用程序 API 的正确方法?

标签 node.js testing express mocha.js

我找到了一种方法,但我的直觉告诉我应该有一些更惯用的方法来做到这一点。基本上我不喜欢的是我必须在测试套件中要求 express 应用程序,这让我想知道是否存在竞争条件。另外,我想知道如果我像这样在多个文件中运行多个测试套件会发生什么情况。

有人知道更清洁的解决方案吗?

我的简化应用如下:

应用程序.js

app = module.exports = express()
...
http.createServer(app).listen(app.get('port'), function(){
     console.log('app listening');
});

测试.js

var request = require('superagent');
var assert = require('assert');
var app = require('../app');
var port = app.get('port');
var rootUrl = 'localhost:'+port;

    describe('API tests', function(){
        describe('/ (root url)', function(){

            it('should return a 200 statuscode', function(done){
                request.get(rootUrl).end(function(res){
                    assert.equal(200, res.status);
                    done();
                });
            });
    ...

最佳答案

mocha 让我们使用 root Suite 为任意数量的测试启动服务器一次:

您还可以选择任何文件并添加“root”级别的 Hook ,例如在 describe()s 之外添加 beforeEach() 然后回调将在任何测试用例之前运行,而不管其所在的文件。这是因为 Mocha 有一个根没有名字的套房。

我们用它来启动一个 Express 服务器一次(我们使用一个环境变量,以便它在与我们的开发服务器不同的端口上运行):

before(function () {
  process.env.NODE_ENV = 'test';
  require('../../app.js');
});

(这里我们不需要 done() 因为 require 是同步的。)这样,服务器只启动一次,不管有多少不同的测试文件包含这个根级 before 函数。

然后我们还使用以下内容,以便我们可以让开发人员的服务器与 nodemon 一起运行并同时运行测试:

  if (process.env.NODE_ENV === 'test') {
    port = process.env.PORT || 3500; // Used by Heroku and http on localhost
    process.env.PORT = process.env.PORT || 4500; // Used by https on localhost
  }
  else {
    port = process.env.PORT || 3000; // Used by Heroku and http on localhost
    process.env.PORT = process.env.PORT || 4000; // Used by https on localhost
  }

关于node.js - 测试快速应用程序 API 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19240047/

相关文章:

python - 如何在Django中查看为测试模型创建的SQL?

scala - 用类替换单例是否有任何潜在问题?

node.js - express.js - 仅对非静态 url 使用中间件

node.js - 几天后,我无法再启动 Puppeteer,直到我重新启动服务器

apache - 为什么在Node.js Express Web框架下需要Apache?

node.js - Express.js Web 服务器在内存耗尽之前在生产环境中持续 5 分钟

node.js - Express Validator - 如何处理条件验证

node.js - RethinkDB Windows 安装

testing - 如何避免 npm 中的 "No test specified"错误?

javascript - 将应用程序部署到谷歌应用程序引擎并希望启动 api 和客户端