我正在尝试为我的一个名为Categories
的模型开发一个测试套件,它只是一个树形结构。我已经编写了一些用于在Jest中开发测试的简单函数(例如.addCategory
,.addNewDeck()
)。
var schemaCategories = new Schema ({
children: [ { type: Schema.Types.ObjectId } ],
parent: { type: Schema.Types.ObjectId },
title: { type: String, default: '' },
});
尽管有适当的猫鼬调试输出,但我的行为还是无法预测的。 例如,如果我更新一个类别,然后立即搜索它,则会得到旧文档。
有时候我搜索两次,问题就解决了。尽管我怀疑这是一个异步问题,但我不确定为什么会发生这种情况。 await
是否不应该等待文档被保存?有没有办法验证保存是否完全完成?如果我在addNewDeck()
之后立即搜索,则将输出null(测试崩溃),并且未添加新类别。
我通读了Jest文档https://jestjs.io/docs/en/tutorial-async,但不清楚我做错了什么。
我的猫鼬调试输出的示例如下(为清楚起见,我删除了一些细节):
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;
}
};
很抱歉,冗长的解释。任何帮助都是无价的。 谢谢。