programing

몽구스 & 고유 필드

topblog 2023. 5. 28. 19:53
반응형

몽구스 & 고유 필드

몽구스가 있는 스키마는 다음과 같습니다.

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 }
});

있습니다unique에 대한 옵션msisdn그리고.imsi.

어떤 경우에는 이 조건이 잘 존중됩니다.다음의 경우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는 매번 모든 인덱스를 다시 만들 시간이 없을 수도 있습니다.

감 잡히는 게 없어요?

사용하다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를 다시 시작합니다.

언급URL : https://stackoverflow.com/questions/21971666/mongoose-unique-field

반응형