Mon problème
J'ai codé une API CRUD très simple et j'ai récemment commencé à coder également certains tests en utilisant chai
et, chai-http
mais j'ai un problème lors de l'exécution de mes tests avec $ mocha
.
Lorsque j'exécute les tests, j'obtiens l'erreur suivante sur le shell:
TypeError: app.address is not a function
Mon code
Voici un échantillon de l'un de mes tests ( /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...
});
});
Et mes express
fichiers d'application ( /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);
});
et ( /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;
Notes supplémentaires
J'ai essayé de déconnecter la server
variable dans le fichier /tests/server-test.js avant d'exécuter les tests:
...
var server = require('../server/app'); // my express app
...
console.log('server: ', server);
...
et je le résultat de c'est un objet vide: server: {}
.
Il est important d'exporter l'
http.Server
objet retourné parapp.listen(3000)
au lieu de la fonction uniquementapp
, sinon vous obtiendrezTypeError: app.address is not a function
.Exemple:
index.js
index.spec.js
la source
http.Server
objet".Cela peut également aider et satisfait le point @dman de changer le code d'application pour s'adapter à un test.
faites votre demande à l'hôte local et au port si nécessaire
chai.request('http://localhost:5000')
au lieu de
chai.request(server)
cela a corrigé le même message d'erreur que j'avais en utilisant Koa JS (v2) et ava js.
la source
Les réponses ci-dessus abordent correctement le problème:
supertest
veut unhttp.Server
travail sur. Cependant, appelerapp.listen()
pour obtenir un serveur démarrera également un serveur d'écoute, c'est une mauvaise pratique et inutile.Vous pouvez contourner cela en utilisant
http.createServer()
:la source
Nous avons eu le même problème lorsque nous avons exécuté mocha en utilisant ts-node dans notre projet sans serveur node + typScript.
Notre tsconfig.json avait "sourceMap": true. Ainsi générés, les fichiers .js et .js.map provoquent des problèmes de transpilage amusants (similaires à celui-ci). Lorsque nous exécutons mocha runner en utilisant ts-node. Donc, je vais définir l'indicateur sourceMap sur false et supprimer tous les fichiers .js et .js.map de notre répertoire src. Ensuite, le problème est parti.
Si vous avez déjà généré des fichiers dans votre dossier src, les commandes ci-dessous seraient vraiment utiles.
trouver src -name " .js.map" -exec rm {} \; trouver src -name " .js" -exec rm {} \;
la source
Juste au cas où, si quelqu'un utilise Hapijs, le problème se produit toujours, car il n'utilise pas Express.js, donc la fonction address () n'existe pas.
La solution de contournement pour le faire fonctionner
la source