.save () метод Mon goose ведет себя неожиданно - PullRequest
0 голосов
/ 03 августа 2020

Я создаю API, который хранит пользователей, позволяет пользователям входить в систему, читать их профиль и т. Д. c на основе имени пользователя и пароля.

Все маршруты успешно построены, но во время тестирования API с использованием библиотеки Supertest, я обнаружил некоторую проблему.

Я попытался создать пользовательский экземпляр userOne следующим образом (перед вызовом метода beforeEach):

//Creating a mock user for testing
const userOneId = new mongoose.Types.ObjectId()
const userOne = new User({
    _id: userOneId,
    name: 'Temp-user',
    email: 'tempuser@gmail.com',
    password: 'tempuser',
    age:40,
    tokens: [{
        token: jwt.sign({_id:userOneId},process.env.JWT_SECRET)
    }]
})
 
beforeEach(async ()=>{
    try{
    await User.deleteMany()
    await userOne.save()
    }catch(e){
        console.log('BeforeEach error: ',e)
    }

Это привело к тому, что мой тест провалился, и beforeEach выдал следующую ошибку:

  BeforeEach error:  DocumentNotFoundError: No document found for query "{ _id: 5f2570846592c22d641e3247 }" on model "User"
        at /home/priyank_linux/Desktop/node-course/task-manager/node_modules/mongoose/lib/model.js:323:38
        at processTicksAndRejections (internal/process/task_queues.js:97:5) {
      result: undefined,
      numAffected: undefined,
      filter: { _id: 5f2570846592c22d641e3247 },
      query: { _id: 5f2570846592c22d641e3247 }
    }

> Однако, когда я попробовал следующий подход к сохранению пользователь перед каждым тестом, все мои тесты прошли

//Creating a mock user for testing
const userOneId = new mongoose.Types.ObjectId()
const userOne = {
    _id: userOneId,
    name: 'Temp-user',
    email: 'tempuser@gmail.com',
    password: 'tempuser',
    age:40,
    tokens: [{
        token: jwt.sign({_id:userOneId},process.env.JWT_SECRET)
    }]
}
 
beforeEach(async ()=>{
    try{
    await  User.deleteMany()
     //creating and saving the user instance at the same time
    await new User(userOne).save()    
    }catch(e){
        console.log('BeforeEach error: ',e)
    }
    
})
 
//All tests passed successfully !

У меня вопрос, почему, когда я одновременно создаю и сохраняю экземпляр модели User, я не получаю ошибку Document not found (что означает, что сохраненный документ фактически сохраняется в базе данных). Где я ошибаюсь?

1 Ответ

0 голосов
/ 05 августа 2020

Вот ответ, который я получил от Udemy, и я считаю, что он точен на 100%:

Поскольку вы создаете только один документ в первом примере, похоже, что Mon goose is пытаюсь обновить существующий документ для всех вызовов сохранения после первого. Проблема в том, что он удален. Таким образом, локальный документ считает, что он был сохранен, но версия сохранения была удалена за кулисами.

...