test spec node before async javascript node.js express mocha chai

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 {} /;