使用Mongoose和Mocha测试重复

时间:2015-08-09 22:36:24

标签: node.js mongodb mongoose mocha should.js

我有以下场景,我的模型具有以下架构

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实例,然后保存它,但我觉得这里还有其他的东西......请帮助!。

1 个答案:

答案 0 :(得分:1)

每次测试后您都在执行myDoc。由于您在测试块之外定义_id变量,因此它的范围对于文件是全局的。通过在第一次测试中保存文档,文档将添加到集合中,然后在测试运行后删除。

因此,当您的第二个测试执行时,mongoose会认为该文档仍然存在于数据库中,并尝试对存储在myDoc对象中的现有0执行更新。由于数据库中不再存在该文档,因此未返回0,因为没有更新文档。由于同样的原因,第二次保存也将返回{{1}},而不是错误。

尝试在第二个测试中创建新文档,而不是全局定义。这应该够了吧。