Masalah Saya
Saya telah mengkodekan CRUD API yang sangat sederhana dan saya baru-baru ini mulai mengkodekan beberapa tes juga menggunakan chai
dan chai-http
tetapi saya mengalami masalah saat menjalankan tes saya $ mocha
.
Ketika saya menjalankan tes saya mendapatkan kesalahan berikut pada shell:
TypeError: app.address is not a function
Kode Saya
Berikut adalah contoh salah satu pengujian saya ( /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...
});
});
Dan express
file aplikasi saya ( /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);
});
dan ( /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;
Catatan ekstra
Saya telah mencoba mengeluarkan server
variabel di file /tests/server-test.js sebelum menjalankan tes:
...
var server = require('../server/app'); // my express app
...
console.log('server: ', server);
...
dan saya hasil yang adalah obyek kosong: server: {}
.
Penting untuk mengekspor
http.Server
objek yang dikembalikan,app.listen(3000)
bukan hanya fungsiapp
, jika tidak, Anda akan mendapatkannyaTypeError: app.address is not a function
.Contoh:
index.js
index.spec.js
sumber
http.Server
objek".Ini juga dapat membantu, dan memenuhi poin @dman untuk mengubah kode aplikasi agar sesuai dengan pengujian.
buat permintaan Anda ke localhost dan port sesuai kebutuhan
chai.request('http://localhost:5000')
dari pada
chai.request(server)
ini memperbaiki pesan kesalahan yang sama saya menggunakan Koa JS (v2) dan ava js.
sumber
Jawaban di atas dengan benar mengatasi masalah:
supertest
inginhttp.Server
dikerjakan. Namun, memanggilapp.listen()
untuk mendapatkan server juga akan memulai server pendengar, ini adalah praktik yang buruk dan tidak perlu.Anda dapat menyiasatinya dengan menggunakan
http.createServer()
:sumber
Kami memiliki masalah yang sama ketika kami menjalankan mocha menggunakan ts-node di proyek tanpa server node + skrip.
Tsconfig.json kita memiliki "sourceMap": true. Jadi, file .js dan .js.map yang dihasilkan menyebabkan beberapa masalah transpiling yang lucu (mirip dengan ini). Saat kami menjalankan mocha runner menggunakan ts-node. Jadi, saya akan menyetel flag sourceMap ke false dan menghapus semua file .js dan .js.map di direktori src kami. Kemudian masalahnya hilang.
Jika Anda telah membuat file di folder src Anda, perintah di bawah ini akan sangat membantu.
temukan src -name " .js.map" -exec rm {} \; temukan src -name " .js" -exec rm {} \;
sumber
Untuk berjaga-jaga, jika seseorang menggunakan Hapijs, masalah masih terjadi, karena tidak menggunakan Express.js, sehingga fungsi address () tidak ada.
Solusi untuk membuatnya berhasil
sumber