Mein Problem
Ich habe eine sehr einfache CRUD API codiert , und ich habe vor kurzem Codierung auch einige Tests begann mit chai
und chai-http
aber ich bin ein Problem, wenn sie mit meinen Tests laufen $ mocha
.
Wenn ich die Tests ausführe, wird der folgende Fehler in der Shell angezeigt:
TypeError: app.address is not a function
Mein Code
Hier ist ein Beispiel eines meiner 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...
});
});
Und meine express
App-Dateien ( /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);
});
und ( /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;
Zusätzliche Hinweise
Ich habe versucht, die server
Variable in der Datei /tests/server-test.js abzumelden , bevor ich die Tests ausführte :
...
var server = require('../server/app'); // my express app
...
console.log('server: ', server);
...
und ich das Ergebnis davon ist ein leeres Objekt : server: {}
.
Es ist wichtig, das zurückgegebene
http.Server
Objektapp.listen(3000)
anstatt nur der Funktion zu exportierenapp
, da Sie sonst erhaltenTypeError: app.address is not a function
.Beispiel:
index.js
index.spec.js
quelle
http.Server
Objekt zu exportieren ".Dies kann ebenfalls hilfreich sein und erfüllt den @ dman-Punkt, den Anwendungscode an einen Test anzupassen.
Stellen Sie Ihre Anfrage nach Bedarf an den lokalen Host und den Port
chai.request('http://localhost:5000')
anstatt
chai.request(server)
Dies behebt die gleiche Fehlermeldung, die ich bei der Verwendung von Koa JS (v2) und ava js hatte.
quelle
Die obigen Antworten sprechen das Problem richtig an: Sie
supertest
möchtenhttp.Server
daran arbeiten. Wenn Sie jedoch anrufenapp.listen()
, um einen Server zu erhalten, wird auch ein Listening-Server gestartet. Dies ist eine schlechte Praxis und nicht erforderlich.Sie können dies umgehen, indem Sie Folgendes verwenden
http.createServer()
:quelle
Wir hatten das gleiche Problem, als wir Mokka mit ts-node in unserem serverlosen Projekt node + typescript ausführen.
Unsere tsconfig.json hatte "sourceMap": true. So generierte .js- und .js.map-Dateien verursachen einige lustige Transpiling-Probleme (ähnlich wie diese). Wenn wir Mokka Runner mit ts-node ausführen. Also werde ich das Flag sourceMap auf false setzen und alle .js- und .js.map-Dateien in unserem src-Verzeichnis löschen. Dann ist das Problem weg.
Wenn Sie bereits Dateien in Ihrem src-Ordner generiert haben, sind die folgenden Befehle sehr hilfreich.
find src -name " .js.map" -exec rm {} \; find src -name " .js" -exec rm {} \;
quelle
Nur für den Fall, dass jemand Hapijs verwendet, tritt das Problem weiterhin auf, da Express.js nicht verwendet wird, sodass die Funktion address () nicht vorhanden ist.
Die Problemumgehung, damit es funktioniert
quelle