在cloud9上使用supertest测试节点表达app

时间:2013-09-08 09:59:47

标签: node.js express cloud9-ide supertest

我无法使用supertest在cloud9上测试快速应用程序:即使是基本测试也会导致ECONNREFUSED。

重现的步骤:

  • 创建一个新的nodejs工作区
  • npm install express supertest
  • 创建一个包含以下代码的文件“fails.js”:

    // Code from supertest page   
    var request = require('supertest')
    , express = require('express');
    var app = express();
    app.get('/user', function(req, res){
      res.send(201, { name: 'tobi' });
    });
    request(app)
    .get('/user')
    .expect('Content-Type', /json/)
    .expect('Content-Length', '20')
    .expect(201)
    .end(function(err, res){
       if (err) throw err;
     });
    

然后在终端上启动node fails.js:错误:连接ECONNREFUSED

jmbarbier@test:~/606588 $ node fails.js
/var/lib/stickshift/522b68364382ecb9de0000ac/app-root/data/606588/fails.js:16
if (err) throw err
               ^
Error: connect ECONNREFUSED
at errnoException (net.js:906:11)
at Object.afterConnect [as oncomplete] (net.js:897:19)

我不知道发生了什么......

========编辑

感谢接受的解决方案,以下是使用mocha在cloud9上测试快速应用程序的代码或限制可用ip / port的任何环境:( works.js)

var request = require('supertest'), server;

before(function(done) {
    var express = require('express');
    var app = express();
    app.get('/user', function(req, res){
      res.send(201, { name: 'tobi' });
    });
    server = app.listen(process.env.PORT, process.env.IP, done);
});

after(function () {
    server.close()
})

describe("Testing /user", function() {
    it("Should return data", function(done) {
        request = request('http://' + process.env.IP + ':' + process.env.PORT);

        request.get('/user')
          .expect('Content-Type', /json/)
          .expect('Content-Length', '20')
          .expect(201)
          .end(function(err, res){
            if (err) throw err;
            done()
          });

    })


})

然后mocha works.js ...

1 个答案:

答案 0 :(得分:3)

通过快速浏览有关Cloud9如何工作的超级代码和模糊知识,您展示的代码似乎强制Express应用程序选择随机端口(如果应用程序尚未监听)并监听。

这不适用于Cloud9,因为据我所知,分配的监听地址是环回地址,并代理到您的项目页面。相反,请使用以下代码:

var request = require('supertest')
var express = require('express');
var app = express();

app.get('/user', function(req, res) {
  res.send(201, { name: 'tobi' });
});

app.listen(process.env.PORT, process.env.IP);

这样,您可以为Express应用程序分配正确的地址和端口,并且supertest不会为其分配随机端口。然后像这样使用supertest:

request = request('http://' + process.env.IP + ':' + process.env.PORT);
request.get('/user')
  .expect('Content-Type', /json/)
  .expect('Content-Length', '20')
  .expect(201)
  .end(function(err, res) {
    if (err) throw err;
  });