我尝试使用mocha对我的restify node.js-app进行单元测试,而不是模拟mongodb数据库。由于某些测试会改变数据库,我希望在每次测试之前重置其内容。
在我的测试中,我还需要访问我正在创建的mongoose文档。因此,我必须在beforeEach
钩子之外定义它们(参见下面的user
文档)。
但是,似乎在清空数据库后第二次无法保存文档。
以下是我提出的最小例子。在这种情况下,第二次测试将失败,因为user
不会再次保存。如果我删除第一个测试,beforeEach
只会被调用一次,一切正常。
此外,如果我在user
挂钩中定义beforeEach
,它也可以。
所以我的实际问题:是否可以解决此问题并在删除文档后第二次保存文档?或者您对如何在beforeEach
挂钩内重置数据库有任何其他想法?在每个测试用例之前设置相同数据库的正确方法是什么?
var mongoose = require('mongoose')
var Schema = mongoose.Schema
var should = require('should')
var flow = require('async')
var UserSchema = new Schema({
username: {type: String, required: true, unique: true},
password: {type: String, required: true},
name: {type: String, default: ''}
})
mongoose.model('User', UserSchema)
var User = mongoose.model('User')
describe('test mocha', function() {
var user = new User({
username: 'max',
password: 'asdf'
})
before(function(done) {
var options = {server: {socketOptions: {keepAlive: 1}}}
mongoose.connect('mongodb://localhost/unittest', options, done)
})
beforeEach(function(done) {
flow.series([
function(callback) {
User.collection.remove(callback)
}, function(callback) {
user.save(callback)
}
], function(err, res) {
done()
})
})
it('should pass', function(done) {
true.should.equal(true)
// also access some elements of user here
done()
})
it('should have a user', function(done) {
User.find().exec(function(err, res) {
res.should.not.be.empty
})
done()
})
after(function(done) {
mongoose.disconnect()
done()
})
})
答案 0 :(得分:1)
我遇到同样的问题,我生成了一份文件副本来保存。在删除文件后需要保存文件时,我保存了副本,然后就可以了。像
var user = new User({
username: 'max',
password: 'asdf'
});
var userCopy = new User({
username: 'max',
password: 'asdf'
});
在测试案例中。
user.remove(callback)
}, function(callback) {
userCopy.save(callback){
// should.not.exist(err)
}
}
这可能不是一个好的解决方案,但它对我有用。