我正在使用nodejs构建REST api,使用mongoose和mochajs来运行一些测试。我有以下方案:
var subscriptionTypeSchema = new mongoose.Schema({
typeId : { type: Number, required: true, unique: true },
name : { type: String, required: true},
active : { type: Boolean, required: true }
});
快速路线:
app.post('/1.0/subscriptiontype', subscriptiontype.create);
控制器:
exports.create = function(req, res) {
validation.subscriptionTypeValidator(req);
var errors = req.validationErrors();
if (errors) {
res.status(400).json({
errors: errors
});
} else {
var subscriptionType = new SubscriptionType();
subscriptionType.typeId = parseInt(req.body.typeId);
subscriptionType.name = req.body.name;
subscriptionType.active = req.body.active;
subscriptionType.save(function(err) {
if (err) {
var parsedError = mongooseutility.parseMongooseError(err);
res.status(400).json({
errors: [parsedError]
});
} else {
res.json({identifier: subscriptionType._id});
}
});
}
};
mongoose实用程序将错误代码映射到更友好的API输出(错误代码11001和11000映射到'重复'错误,如测试中所示)。
方法前的摩卡:
before(function(done) {
db.connection.on('open', function() {
db.connection.db.dropDatabase(function(err) {
done();
});
});
});
我已经验证数据库已成功删除。
测试本身使用supertest发出请求。在此测试之前,我有一个测试,它成功创建了typeId 4的订阅类型,因此这个应该失败:
it('Should not create subscription with taken type id', function (done) {
request(app.privateapi)
.post('/1.0/subscriptiontype')
.set('Authorization', authorizationHeader)
.send({
typeId: 4,
name: 'New package',
active: 1
})
.expect(function (res) {
if (res.status !== 400) {
throw new Error('Status code was not 400');
}
var expectedResponse = { errors: [ { param: 'typeId', msg: 'duplicate' } ] };
if (JSON.stringify(res.body) !== JSON.stringify(expectedResponse)) {
throw new Error('Output was not was as expected');
}
})
.end(done);
});
使用grunt-simple-mocha调用测试。
此测试第一次运行,但是当我第二次运行它时,它在唯一验证上失败。它第三次再次运作。我已经做了一些搜索,发现在重新创建索引时可能与竞争条件有关,所以我在再次运行测试之前尝试重新启动mongodb,但这并不起作用。我在这里找到了一个解决方案:http://grokbase.com/t/gg/mongoose-orm/138qe75dvr/mongoose-unique-index-test-fail但我不确定如何实现这一点。有什么想法吗?
编辑:现在我通过将数据库放在'之后来修复它。方法(而不是'之前')。所有测试都运行良好,但在测试完成后保留测试数据,检查等等会很好...
答案 0 :(得分:0)
您没有测试表的创建,因此您只需清空集合而不是创建数据库。
沿着这些方向的东西(未经测试):
beforeEach(function(done){
var models = Object.keys(mongoose.models);
var expects = models.length;
if(expects == 0) return done();
var removeCount = 1;
//maybe use async or something else but whatever
models.forEach(function(model){
model.remove({}, function(){
if(removeCount == expects){
done();
}
removeCount++;
})
});
});