我有以下场景,我的模型具有以下架构
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应该能够知道我想保存它,然后,数据库是干净的,所以它应该在数据库中插入一个新文档,而不是更新它。受影响的行返回0,这意味着mongoose没有触及数据库,所以发生了什么?我用猫鼬错了吗?如果是的话,我该怎么测试呢?
围绕它的唯一方法是在myDoc var中创建一个新的MyModel实例,然后保存它,但我觉得这里还有其他的东西......请帮助!。
答案 0 :(得分:1)
每次测试后您都在执行myDoc
。由于您在测试块之外定义_id
变量,因此它的范围对于文件是全局的。通过在第一次测试中保存文档,文档将添加到集合中,然后在测试运行后删除。
因此,当您的第二个测试执行时,mongoose会认为该文档仍然存在于数据库中,并尝试对存储在myDoc
对象中的现有0
执行更新。由于数据库中不再存在该文档,因此未返回0
,因为没有更新文档。由于同样的原因,第二次保存也将返回{{1}},而不是错误。
尝试在第二个测试中创建新文档,而不是全局定义。这应该够了吧。