摩卡APItesting:得到'TypeError:app.address不是一个函数'
我的问题
我已经编写了一个非常简单的CRUD API,最近我也开始编写一些使用chai
和chai-http
testing,但是在使用$ mocha
运行我的testing时遇到了问题。
当我运行testing时,在shell上出现以下错误:
TypeError: app.address is not a function
我的代码
这里是我的一个testing( /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... }); });
和我的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); });
和( /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;
额外的笔记
我已经尝试在运行testing之前在/tests/server-test.js文件中注销server
variables:
... var server = require('../server/app'); // my express app ... console.log('server: ', server); ...
我的结果是一个空的对象: server: {}
。
您不会在应用程序模块中导出任何内容。 尝试添加到您的app.js文件:
module.exports = server
这也可能有所帮助,并满足更改应用程序代码以适应testing的@dman要点。
根据需要向本地主机和端口发送请求chai.request('http://localhost:5000')
代替
chai.request(server)
这固定了我使用Koa JS(v2)和ava js的同样的错误信息。
导出由app.listen(3000)
返回的http.Server
对象而非仅仅是函数app
,否则您将得到TypeError: app.address is not a function
。
例:
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 ...', () => {