使用 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,而不是错误。

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