在mocha测试中,Mongoose验证无法正常工作

时间:2015-03-01 09:46:22

标签: node.js mongoose mocha

我正在使用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但我不确定如何实现这一点。有什么想法吗?

编辑:现在我通过将数据库放在'之后来修复它。方法(而不是'之前')。所有测试都运行良好,但在测试完成后保留测试数据,检查等等会很好...

1 个答案:

答案 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++;
        })
    });
});