Node.js Тестирование с Mongoose.уникальный игнорируется - PullRequest
0 голосов
/ 11 октября 2018

У меня небольшие проблемы с интеграционным тестом для моего приложения mongoose.Проблема в том, что мои уникальные настройки постоянно игнорируются.Схема выглядит более или менее так (поэтому здесь нет ничего необычного)

const RealmSchema:Schema = new mongoose.Schema({
    Title : {
        type : String,
        required : true,
        unique : true
    },    
    SchemaVersion : {
        type : String,
        default : SchemaVersion,
        enum: [ SchemaVersion ]
    }
}, {
    timestamps : {
        createdAt : "Created",
        updatedAt : "Updated"
    }
});

Похоже, что в основном все правила, установленные в схеме, игнорируются.Я могу передать число / логическое, где требуется строка.Единственное, что работает, это то, что поля, которые не были объявлены в схеме, не будут сохранены в БД

Первая вероятная причина:

У меня такое чувство, что это может иметь отношение к тому, как я тестирую.У меня есть несколько интеграционных тестов.После каждого из них моя база данных удаляется (поэтому у меня одно и то же условие для каждого теста и предварительное условие для базы данных в этом тесте).

Возможно, причина в том, что мои индексы сбрасываются с базой данных и не перезапускаютсякогда следующий текст снова создаст базу данных и коллекцию?И если это так, как я могу убедиться, что после каждого теста я получаю пустую базу данных, которая все еще учитывает все мои настройки схемы?

Вторая вероятная причина:

Я использую TypeScript в этом проекте.Возможно, что-то не так в определении схемы и модели.Это то, что я делаю.

1.Создайте схему (код сверху)

2.Создайте интерфейс для модели (где IRealmM расширяет интерфейс для использования в mongoose)

import { SpecificAttributeSelect } from "../classes/class.specificAttribute.Select";
import { SpecificAttributeText } from "../classes/class.specificAttribute.Text";
import { Document } from "mongoose";

interface IRealm{
    Title : String;
    Attributes : (SpecificAttributeSelect | SpecificAttributeText)[];
}

interface IRealmM extends IRealm, Document {

}

export { IRealm, IRealmM }

3.Создать модель

import { RealmSchema } from '../schemas/schema.Realm';
import { Model } from 'mongoose';
import { IRealmM } from '../interfaces/interface.realm';


// Apply Authentication Plugin and create Model
const RealmModel:Model<IRealmM> = mongoose.model('realm', RealmSchema);

// Export the Model
export { RealmModel }

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

ОК, я наконец понял это.Ключевой вопрос описан здесь

Mongoose Уникальный индекс не работает!

В своем ответе Solstice333 заявляет, что sureIndex устарел (предупреждение, которое я получаю уже некоторое время), Я думал, что это все еще работает, хотя)

После добавления .createIndexes () к модели, оставляя меня со следующим кодом, он работает (по крайней мере, насколько я не тестирую. Подробнее об этом после кода)

// Apply Authentication Plugin and create Model
const RealmModel:Model<IRealmM> = mongoose.model('realm', RealmSchema);
RealmModel.createIndexes();

Теперь проблема заключается в том, что индексы устанавливаются при первом установлении соединения, но не при удалении базы данных в процессе (что, по крайней мере, для меня происходит послекаждый интеграционный тест)

Так что в моих тестах функция resetDatabase будет выглядеть так, чтобы убедиться, что установлены все индексы

const resetDatabase = done => {
    if(mongoose.connection.readyState === 1){
        mongoose.connection.db.dropDatabase( async () => {
            await resetIndexes(mongoose.models);
            done();
        });
    } else {
        mongoose.connection.once('open', () => {
            mongoose.connection.db.dropDatabase( async () => {
                await resetIndexes(mongoose.models);
                done();
            });  
        });      
    }
};

const resetIndexes = async (Models:Object) => {
    let indexesReset: any[] = [];
    for(let key in Models){
        indexesReset.push(Models[key].createIndexes());
    }
    Promise.all(indexesReset).then( () => {
        return true;
    });   
}
0 голосов
/ 12 октября 2018

Уникальные параметры не валидатор.Проверьте эту ссылку из документации Mongoose.

...