Я пытаюсь разработать набор тестов для одной из моих моделей под названием 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;
}
};
Извините за длинное объяснение.Любая помощь будет неоценимой.Спасибо.