更新后无法检索更新的文档

时间:2019-06-29 20:58:14

标签: node.js mongoose jestjs

我正在尝试为我的一个名为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;
}
};

很抱歉,冗长的解释。任何帮助都是无价的。 谢谢。

0 个答案:

没有答案