0

我无法使用 supertest 在 cloud9 上测试 express 应用程序:即使是基本测试也会抛出 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;
     });
    

然后在终端上启动节点失败.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 的环境中测试 express 应用程序的代码:(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...

4

1 回答 1

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;
  });
于 2013-09-08T15:27:43.340 回答