Mongoose Schema.index на нескольких полях не работает с тестами - PullRequest
0 голосов
/ 10 июня 2019

Я создал uploadSchema (mongoose.Schema) с полями (среди остальных): ключ и корзина. каждый из них не уникален, но вместе я хочу, чтобы они создали уникальный идентификатор. в своем коде я использовал строку (сразу после объявления uploadSchema и прямо перед uploadModel):

uploadSchema.index({ key: 1, bucket: 1 }, { unique: true, background: true });

, но в моих тестах (mocha и chai) индексация не применяется, и поэтому я могу создать два экземпляра с одним и тем же ключом и сегментом (в моем случае). например, в моем коде:

await uploadModel.create({ key: testUpload.key, bucket: testUpload.bucket, 
name: 'name1',  ownerID: USER.id, parent: null }).should.eventually.exist;

и сразу после этого:

await uploadModel.create({key: testUpload.key, bucket: testUpload.bucket,
 name: 'name1', ownerID: USER.id, parent: null }).should.eventually.be.rejected;

не выдает правильную ошибку:

AssertionError: expected promise to be rejected but it was fulfilled with { Object ($__, isNew, ...) }

Я не правильно его использую? Или есть проблема с индексацией и тестированием?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

так что я разобрался!По-видимому, я использовал mongoose.connection.dropDatabase(); в моем после каждого теста.Это означает, что индексы были сброшены каждый раз.Поэтому я каждый раз в своих тестах пересоздавал индексы:

  before(async () => {
    // Remove files from DB
    const collections = ['files', 'uploads'];
    for (const i in collections) {
      mongoose.connection.db.createCollection(collections[i], (err) => {});
    }
    await mongoose.connection.collections['files'].createIndex({ name: 1, parent: 1, ownerID: 1 }, { unique: true });
    await mongoose.connection.collections['uploads'].createIndex({ key: 1, bucket: 1 }, { unique: true });
  });

И в beforeEach:

  beforeEach(async () => {
    const removeCollectionPromises = [];
    for (const i in mongoose.connection.collections) {
      removeCollectionPromises.push(mongoose.connection.collections[i].deleteMany({}));
    }
    await Promise.all(removeCollectionPromises);
  });

afterEach пусто.теперь это работает:)

0 голосов
/ 10 июня 2019

Скорее всего, вы установили для autoIndex значение false в вашем соединении (что рекомендуется делать).

Либо добавьте его к себе. Схема:

let uploadSchema = mongoose.Schema({ ... }, {autoIndex: true});

Но я бы порекомендовал просто создать индекс самостоятельно для базы данных, я думаю, что это самый безопасный способ обойти это.

...