【问题标题】:Testing for duplication with Mongoose and Mocha使用 Mongoose 和 Mocha 进行重复测试
【发布时间】:2015-11-01 18:34:28
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 1970-01-01
      • 2015-05-11
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多