使用 Mongoose 和 Mocha 进行重复测试
Testing for duplication with Mongoose and Mocha
我有以下场景,我的模型具有以下架构
var MySchema = new Schema({
name: {type: String, required: true, unique: true}
})
var MyModel = mongoose.model('MyModel', MySchema)
以及以下测试(很抱歉,它很长,但我所有的观察都在那里!):
var myDoc = new MyModel({name: 'My Name'})
describe('My Model Test', function(){
before('we start fresh...', function(done){
MyModel.remove(function(){
done()
})
})
afterEach('and we clean after every test', function(done){
MyModel.remove(function(){
done()
})
})
it('should fail saving duplicate id', function(done){
myDoc.save(function(){
var myDuplicate = new MyModel(myDoc)
//I'll make sure that it's a copy first...
myDuplicate.should.have.property('id', myDoc.id)
myDuplicate.save(function(err){
should.exist(err)
done()
})
})
})
//SO FAR SO GOOD, but now it gets weird
it('should fail saving duplicate name', function(done){
//to make it really fair, lets change the name of myDoc
myDoc.name = 'Another name'
myDoc.save(function(err, doc, affected){
console.log(affected) //First, this outputs 0... weird
var otherDoc = new MyModel({name: 'Another name'})
otherDoc.save(function(err, otherDoc){
should.exist(err) //Nope, no error whatsoever
done()
})
})
})
})
我确定第二次调用 myDoc#save() 有问题,但我不知道为什么,我修改了模型,mongoose 应该能够知道我想保存它,然后结束也就是说,数据库是干净的,所以它应该在数据库中插入一个新文档,而不是更新它。受影响的行 return 0,这意味着 mongoose 没有接触数据库,所以这是怎么回事?我用猫鼬错了吗?如果是这样,我该如何测试?
解决它的唯一方法是在 myDoc var 中创建一个新的 MyModel 实例,然后保存它,但我觉得这里还有其他地方……请帮忙!
您在每次测试后执行 MyModel.remove()
。由于您在测试块之外定义 myDoc
变量,因此它的范围对文件是全局的。通过在第一次测试中保存文档,文档将被添加到集合中,然后在测试运行后删除。
因此,当您执行第二个测试时,mongoose 会认为该文档仍然存在于数据库中,并尝试对存储在 myDoc
对象中的现有 _id
执行更新。由于该文档不再存在于数据库中,因此它将 return 0
因为没有更新任何文档。出于同样的原因,第二次保存也会 return 0
,而不是错误。
尝试在第二个测试中创建一个新文档,而不是全局定义它。这应该够了吧。
我有以下场景,我的模型具有以下架构
var MySchema = new Schema({
name: {type: String, required: true, unique: true}
})
var MyModel = mongoose.model('MyModel', MySchema)
以及以下测试(很抱歉,它很长,但我所有的观察都在那里!):
var myDoc = new MyModel({name: 'My Name'})
describe('My Model Test', function(){
before('we start fresh...', function(done){
MyModel.remove(function(){
done()
})
})
afterEach('and we clean after every test', function(done){
MyModel.remove(function(){
done()
})
})
it('should fail saving duplicate id', function(done){
myDoc.save(function(){
var myDuplicate = new MyModel(myDoc)
//I'll make sure that it's a copy first...
myDuplicate.should.have.property('id', myDoc.id)
myDuplicate.save(function(err){
should.exist(err)
done()
})
})
})
//SO FAR SO GOOD, but now it gets weird
it('should fail saving duplicate name', function(done){
//to make it really fair, lets change the name of myDoc
myDoc.name = 'Another name'
myDoc.save(function(err, doc, affected){
console.log(affected) //First, this outputs 0... weird
var otherDoc = new MyModel({name: 'Another name'})
otherDoc.save(function(err, otherDoc){
should.exist(err) //Nope, no error whatsoever
done()
})
})
})
})
我确定第二次调用 myDoc#save() 有问题,但我不知道为什么,我修改了模型,mongoose 应该能够知道我想保存它,然后结束也就是说,数据库是干净的,所以它应该在数据库中插入一个新文档,而不是更新它。受影响的行 return 0,这意味着 mongoose 没有接触数据库,所以这是怎么回事?我用猫鼬错了吗?如果是这样,我该如何测试?
解决它的唯一方法是在 myDoc var 中创建一个新的 MyModel 实例,然后保存它,但我觉得这里还有其他地方……请帮忙!
您在每次测试后执行 MyModel.remove()
。由于您在测试块之外定义 myDoc
变量,因此它的范围对文件是全局的。通过在第一次测试中保存文档,文档将被添加到集合中,然后在测试运行后删除。
因此,当您执行第二个测试时,mongoose 会认为该文档仍然存在于数据库中,并尝试对存储在 myDoc
对象中的现有 _id
执行更新。由于该文档不再存在于数据库中,因此它将 return 0
因为没有更新任何文档。出于同样的原因,第二次保存也会 return 0
,而不是错误。
尝试在第二个测试中创建一个新文档,而不是全局定义它。这应该够了吧。