这是我的mocha测试文件 test-api.js
:
var should = require('should');
var mongoose = require('mongoose');
var request = require('supertest');
var db = require('../config/db');
var post = require('../app/models/post');
var faker = require('faker');
describe('Post', function () {
var url = 'http://localhost:3000';
before(function (done) {
var db_url = db.url_test;
mongoose.connect(db_url, done);
});
it('should post a post and get the post back', function (done) {
var _body = {
title: faker.name.title(),
body: faker.lorem.paragraph()
};
//console.log(_body);
request(url)
.post('/api/post')
.send(_body)
.end(function (err, res) {
//if (err) {
// console.log(err);
// //console.log('/api/post post method failed!');
//}
//console.log('res.body: ');
//console.log(res.body);
res.body.should.have.property('url');
res.body.should.have.property('title');
res.body.should.have.property('body');
res.body.should.have.property('date');
done();
});
});
it('should get all the posts', function (done) {
request(url)
.get('/api/post')
.expect(200)
.end(function (err, res) {
if (err) {
console.log(err);
//console.log('/api/post get method failed!')
}
res.body.should.have.property('count');
res.body.should.have.property('limit');
res.body.should.have.property('page');
res.body.should.have.property('results');
//console.log(res.body);
done();
});
});
});
我觉得问题出在before
函数里面,因为如果我把mongoose.connect()
放在server.js
里面 (这是我的api服务器的启动文件), 我就可以正常通过测试.
但是我想在测试文件中临时指定单独的测试用数据库,而不是在server.js
里面就指定好,所以把mongoose.connect()
放在测试文件内.
这是上面这个mocha
测试文件的测试结果:
Post
1) should post a post and get the post back
✓ should get all the posts (52ms)
1 passing (2s)
1 failing
1) Post should post a post and get the post back:
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
我现在也不知道要怎么处理这个问题了,求各位大神帮忙啊!(T_T)…先谢谢大家了!
describe('#get_all_unchecked()', function() {
it('should return get_all_unchecked().length() > 0 when only 1 product', function(done) {
this.timeout(15000);
Product.get_all_uncheckedAsync().then(function(products){
var product = products[0]
//console.log("spread" + product.name);
assert.equal(product.name, 'get all');
done()
}).catch(function(err) {
console.log("There was an error" + err);
done(err)
});
});
```
this.timeout(15000);
@i5ting 在这个测试文件中每一个it
里面都要用这个吗?
@i5ting 我想问一下为什么要这样来结局?是哪里的问题啊?
你根本不会用supertest。。。。
@i5ting 。。。。不行
感觉是你的’/api/post’的post router 处理上在依赖其它的非测试环境,你在这个post处理逻辑里面加些log,看看执行情况呗, 既然get测试过了,应该不是db连接的问题
找到问题的解决办法了,2楼说的对,我supertest用错了。
我应该在测试文件里面导入api所在的app,然后放到request()参数表里面,而不是用url,这样就可以通过。
如果不在测试文件里面直接对app发送request,而是用url来进行发送的话,api里面会收到request,但是不会产生任何response。
可能原因是这个时候database的连接在api里不可用吧。