Не удается получить обновленный документ после его обновления - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь разработать набор тестов для одной из моих моделей под названием Categories, которая представляет собой просто древовидную структуру.Я написал несколько простых функций, для которых я разрабатываю тесты в Jest (например, .addCategory, .addNewDeck()).

var schemaCategories = new Schema ({
    children: [ {   type: Schema.Types.ObjectId } ],
    parent: {   type: Schema.Types.ObjectId },
    title: { type: String, default: '' },
});

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

Иногда, если я ищу дважды , проблема решается.Я не уверен, почему это происходит, хотя я подозреваю, что это асинхронная проблема .await не должен ли ждать, пока документ будет сохранен?Есть ли способ проверить, что сохранение полностью завершено?Если я выполню поиск сразу после addNewDeck(), я выведу ноль (тест завершается неудачей), и новая категория не будет добавлена.

Я прочитаю документацию Jest https://jestjs.io/docs/en/tutorial-async, однако не ясно, если яделаю что-то не так.

Пример моего вывода отладочной программы mongoose следующий (я удалил некоторые детали для ясности):

Mongoose: Categories.insertOne({ children: [], title: 'ohryfe', _id: ObjectId("5d17c45a4bc8f395f0ab0cb1") })

Mongoose: Categories.findOne({ _id: ObjectId("5d17c45a4bc8f395f0ab0cb1") }, { projection: {} })

 console.log models/categories.test.js:99
{ children: [],
  title: 'ohryfe',
  _id: 5d17c45a4bc8f395f0ab0cb1,
  __v: 0 }

Mongoose: Categories.findOne({ _id: ObjectId("5d17c45a4bc8f395f0ab0cb1") }, { projection: {} })

Mongoose: Categories.updateOne({ _id: ObjectId("5d17c45a4bc8f395f0ab0cb1") }, { '$push': { children: { '$each': [ ObjectId("5d17c45c4bc8f395f0ab0cb2") ] } } })

Mongoose: Categories.insertOne({ children: [], title: 'vgebn', _id: ObjectId("5d17c45c4bc8f395f0ab0cb2"), parent:  ObjectId("5d17c45a4bc8f395f0ab0cb1") })

console.log models/categories.test.js:114
{ children: [], 
  title: 'ohryfe',
  _id: 5d17c45a4bc8f395f0ab0cb1,
  __v: 0 }

Когда я проверяю свою базу данных, я вижу "children" : [ ObjectId("5d17c45c4bc8f395f0ab0cb2") ].

describe('addCategory()', () => {
    it('Children are added.', async () => {
       let deck = await Categories.addNewDeck({ title: randomTitle() });

       let category = await Categories.findById({ _id: deck._id });
       console.log(category);

       let child = await category.addCategory({
         title: randomTitle(),
         publish: false
       });

       category = await Categories.findById({ _id: deck._id });
       console.log(category);

       expect(false).toBe(true);
  });
});

Если добавить это к концу, я получу правильный вывод ...

category = await Categories.findById({ _id: deck._id });
console.log(category);
category = await Categories.findById({ _id: deck._id });
console.log(category);

Я включил addNewdeck().addCategory() похоже, но это метод.

_statics.addNewDeck = async function(params) {
try {
    let deck = new Categories({
        title: params.title,
        publish: false,
        root: true
        });
    await deck.save();
    return deck;
} catch(err) {
    return err;
}
};

Извините за длинное объяснение.Любая помощь будет неоценимой.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...