正确的方法来测试快速应用程序API?

时间:2013-10-08 05:50:39

标签: node.js testing express mocha

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

任何人都知道更清洁的解决方案吗?

我的简化应用程序如下:

app.js

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

test.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();
                });
            });
    ...

2 个答案:

答案 0 :(得分:2)

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

You may also pick any file and add "root" level hooks, for example add beforeEach() outside of describe()s then the callback will run before any test-case regardless of the file its in. This is because Mocha has a root Suite with no name.

我们使用它来启动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
  }

答案 1 :(得分:1)

我使用了一个名为supertest github.com/visionmedia/supertest的模块,它适用于此。