Mi problema
He codificado una API CRUD muy simple y recientemente comencé a codificar también 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 express
archivos de aplicación ( /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 la sesión de la server
variable 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 ello es un objeto vacío: server: {}
.
Es importante exportar el
http.Server
objeto devuelto por enapp.listen(3000)
lugar de solo la funciónapp
, de lo contrario obtendráTypeError: app.address is not a function
.Ejemplo:
index.js
index.spec.js
fuente
http.Server
objeto".Esto también puede ayudar y satisface el punto de @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 al usar Koa JS (v2) y ava js.
fuente
Las respuestas anteriores abordan correctamente el problema:
supertest
quierehttp.Server
que se trabaje. Sin embargo, llamarapp.listen()
para obtener un servidor también iniciará un servidor de escucha, esta es una mala práctica e innecesaria.Puede sortear esto usando
http.createServer()
:fuente
Tuvimos el mismo problema cuando ejecutamos mocha usando ts-node en nuestro proyecto sin servidor node + typecript.
Nuestro tsconfig.json tenía "sourceMap": true. Los archivos .js y .js.map generados de esta manera causan algunos problemas de transpilación divertidos (similares a este). 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 en 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.
buscar src -name " .js.map" -exec rm {} \; buscar src -name " .js" -exec rm {} \;
fuente
Por si acaso, si alguien usa Hapijs, el problema aún ocurre, porque no usa Express.js, por lo que la función address () no existe.
La solución para que funcione
fuente