javascript - spec - Prueba de Mocha API: obteniendo ''TypeError: app.address no es una función''
node js rest api testing (5)
Es importante exportar el objeto
http.Server
devuelto por
app.listen(3000)
lugar de solo la
app
función, de lo contrario obtendrá
TypeError: app.address is not a function
.
Ejemplo:
index.js
const koa = require(''koa'');
const app = new koa();
module.exports = app.listen(3000);
index.spec.js
const request = require(''supertest'');
const app = require(''./index.js'');
describe(''User Registration'', () => {
const agent = request.agent(app);
it(''should ...'', () => {
Mi problema
Codifiqué una API CRUD muy simple y recientemente comencé a codificar algunas pruebas usando
chai
y
chai-http
pero tengo un problema al ejecutar mis pruebas con
$ mocha
.
Cuando ejecuto las pruebas, aparece el siguiente error en el shell:
TypeError: app.address is not a function
Mi código
Aquí hay una muestra de una de mis pruebas ( /tests/server-test.js ):
var chai = require(''chai'');
var mongoose = require(''mongoose'');
var chaiHttp = require(''chai-http'');
var server = require(''../server/app''); // my express app
var should = chai.should();
var testUtils = require(''./test-utils'');
chai.use(chaiHttp);
describe(''API Tests'', function() {
before(function() {
mongoose.createConnection(''mongodb://localhost/bot-test'', myOptionsObj);
});
beforeEach(function(done) {
// I do stuff like populating db
});
afterEach(function(done) {
// I do stuff like deleting populated db
});
after(function() {
mongoose.connection.close();
});
describe(''Boxes'', function() {
it.only(''should list ALL boxes on /boxes GET'', function(done) {
chai.request(server)
.get(''/api/boxes'')
.end(function(err, res){
res.should.have.status(200);
done();
});
});
// the rest of the tests would continue here...
});
});
Y mis archivos de aplicación
express
(
/server/app.js
):
var mongoose = require(''mongoose'');
var express = require(''express'');
var api = require(''./routes/api.js'');
var app = express();
mongoose.connect(''mongodb://localhost/db-dev'', myOptionsObj);
// application configuration
require(''./config/express'')(app);
// routing set up
app.use(''/api'', api);
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log(''App listening at http://%s:%s'', host, port);
});
y ( /server/routes/api.js ):
var express = require(''express'');
var boxController = require(''../modules/box/controller'');
var thingController = require(''../modules/thing/controller'');
var router = express.Router();
// API routing
router.get(''/boxes'', boxController.getAll);
// etc.
module.exports = router;
Notas adicionales
Intenté cerrar sesión en la variable del
server
en el archivo
/tests/server-test.js
antes de ejecutar las pruebas:
...
var server = require(''../server/app''); // my express app
...
console.log(''server: '', server);
...
y el resultado de eso es un objeto vacío:
server: {}
.
Esto también puede ayudar y satisface el punto @dman de cambiar el código de la aplicación para que se ajuste a una prueba.
haga su solicitud al localhost y al puerto según sea necesario
chai.request(''http://localhost:5000'')
en vez de
chai.request(server)
esto solucionó el mismo mensaje de error que tenía usando Koa JS (v2) y ava js.
Las respuestas anteriores abordan correctamente el problema:
supertest
quiere que
http.Server
un
http.Server
.
Sin embargo, llamar a
app.listen()
para obtener un servidor también iniciará un servidor de escucha, esta es una mala práctica e innecesaria.
Puede evitar esto utilizando
http.createServer()
:
import * as http from ''http'';
import * as supertest from ''supertest'';
import * as test from ''tape'';
import * as Koa from ''koa'';
const app = new Koa();
# add some routes here
const apptest = supertest(http.createServer(app.callback()));
test(''GET /healthcheck'', (t) => {
apptest.get(''/healthcheck'')
.expect(200)
.expect(res => {
t.equal(res.text, ''Ok'');
})
.end(t.end.bind(t));
});
No exportas nada en el módulo de tu aplicación. Intente agregar esto a su archivo app.js:
module.exports = server
Tuvimos el mismo problema cuando ejecutamos mocha usando ts-node en nuestro proyecto de servidor node + typecript sin servidor.
Nuestro tsconfig.json tenía "sourceMap": verdadero. Así generado, los archivos .js y .js.map causan algunos problemas divertidos de transpilación (similar a esto). Cuando ejecutamos mocha runner usando ts-node. Por lo tanto, estableceré el indicador sourceMap en falso y eliminaré todos los archivos .js y .js.map de nuestro directorio src. Entonces el problema se ha ido.
Si ya ha generado archivos en su carpeta src, los siguientes comandos serían realmente útiles.
busque src -name " .js.map" -exec rm {} /; encuentre el nombre-src " .js" -exec rm {} /;