2014-02-23 114 views
20

我有貓鼬以下模式:貓鼬和獨特的領域

var SimSchema = new Schema({ 
    msisdn  : { type : String , unique : true, required : true }, 
    imsi  : { type : String , unique : true, required : true }, 
    status  : { type : Boolean, default: true}, 
    signal  : { type : Number }, 
    probe_name : { type: String , required : true } 
}); 

我對msisdnimsiunique選項。

在某些情況下,此條件得到了很好的尊重。 對於以下mocha測試:

"use strict"; 

var app  = require('../../app'); 
var http  = require('http'); 
var request = require('supertest'); 
var mongoose = require('mongoose'); 
var should = require('should'); 



describe('[ Sim controller ] ', function(){ 
    before(function(done) { 
    app.set_env('test'); 
    this.server = app.start(function() { 
     mongoose.connection.db.dropDatabase(function() { 
     done(); 
     }) 
    }); 
    }); 


    beforeEach(function(done){ 
    done(); 
    }); 


    it('Sim with good parameters should be created in the database', function(done){ 
    var newSim = { 
     msisdn:  '1234', 
     imsi:  '007', 
     probe_name: 'BOUCHON_1' 
    }; 

    request(this.server) 
     .post('/sims') 
     .set('Content-Type', 'application/json') 
     .send(newSim) 
     .expect(200).end(function(err, res) { 
     if (err) return done(err); 
     res.body.should.have.property('imsi'); 
     res.body.should.have.property('probe_name'); 
     res.body.should.have.property('msisdn'); 
     setTimeout(function() { 
      done(); 
     }, 1000); 
     }); 
    }); 


    it('Sim imsi/msisdn is unique in the database', function(done){ 
    var newSim = { 
     msisdn:  '1234', 
     imsi:  '007', 
     probe_name: 'BOUCHON_1' 
    }; 

    request(this.server) 
     .post('/sims') 
     .set('Content-Type', 'application/json') 
     .send(newSim) 
     .expect(200).end(function(err, res) { 
     if (err) return done(err); 
     res.body.should.have.property('error').equal('Duplicate Item'); 
     done(); 
     }); 
    }); 


    after(function(done) { 
    app.stop(done); 
    }); 
}); 

它的正常工作,如果我直接運行:

julio$ mocha test/controllers/ctrl_sim.js 

,但如果我運行它得益於隱性選項失敗:

1) [ Sim controller ] Sim imsi/msisdn is unique in the database: 
    Uncaught AssertionError: expected { __v: 0, 
    imsi: '007', 
    msisdn: '1234', 
    probe_name: 'BOUCHON_1', 
    _id: '530a2b7f52273aa90783baf0', 
    status: true } to have property 'error' 

我在堆棧上讀到,有時候unique條件沒有得到很好的尊重,因爲索引沒有被刷新。 你認爲這是我的情況嗎?實際上,我刪除了每個摩卡測試套件的數據庫。也許mongo沒有時間重新創建所有的索引。

任何想法?

回答

33

使用dropDups確保丟棄模式中的重複記錄,如:

var SimSchema = new Schema({ 
    msisdn  : { type : String , unique : true, required : true, dropDups: true }, 
    imsi  : { type : String , unique : true, required : true, dropDups: true }, 
    status  : { type : Boolean, default: true}, 
    signal  : { type : Number }, 
    probe_name : { type: String , required : true } 
}); 

和運行測試之前,請重新啓動MongoDB的

+7

我無法理解使用dropDups'的'。你能詳細說明一下嗎? –

+3

@VikasBansal我猜如果你將dropDups設置爲true,那麼mongodb會刪除先前創建的重複項(如果有的話) –

+1

@HasaanAli不完全 - dropDups意味着MongoDB將「丟棄」試圖創建記錄的任何查詢,數據庫中已經存在。 例如:如果您已經有一個名爲「bob」的記錄,並且您嘗試使用'name:bob'插入另一條記錄,則此插入將由於dropDups而失敗。 –