我无法使用supertest在cloud9上测试快速应用程序:即使是基本测试也会导致ECONNREFUSED。
重现的步骤:
创建一个包含以下代码的文件“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
...
答案 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;
});