Я не могу тестировать экспресс-приложения в cloud9 с помощью супертеста: даже базовые тесты выдают ECONNREFUSED.
Действия по воспроизведению :
- создать новую рабочую область nodejs
- npm установить экспресс-супертест
создайте файл 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 / порт: (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 ответ
После быстрого просмотра кода супертеста и смутных знаний о том, как работает 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, и супертест не будет назначать ему случайный порт. Затем используйте такой супертест:
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;
});
Похожие вопросы
Новые вопросы
node.js
Node.js — это основанная на событиях, неблокирующая, асинхронная среда выполнения ввода-вывода, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на стороне клиента, так и на стороне сервера и, следовательно, выигрывают от возможности повторного использования кода и отсутствия переключения контекста.
process.exit()
для выхода из процесса,app.close()
чтобы остановить прослушивание HTTP-сервером (непроверенное утверждение).