Jest TypeError: Document.save не является функцией - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь написать несколько тестов для приложения Express, где у меня есть модель User. Один из моих методов выглядит следующим образом:

let user = await User.findById(req.params.userId);
user.name = req.body.name || user.name; 
user.password = req.body.password || user.
user = await user.save();

Код работает так, как должен, но когда я проверяю его, Джест жалуется:

TypeError: user.save is not a function

Прямо сейчас Я высмеиваю всю свою модель пользователя следующим образом:

jest.mock('../../models/User');

Я пытался смоделировать функцию сохранения следующим образом, но ничего не изменилось:

jest.spyOn(User.prototype, 'save')
      .mockImplementationOnce(() => Promise.reject('fail update'))

Как Я уже говорил, код работает нормально. Я не получаю эту ошибку при запуске сервера.

Однако происходит одна странная вещь: когда я запускаю тесты, я получаю это предупреждение от mon goose

Mon goose: похоже, вы пытаетесь протестируйте приложение Mon goose в стандартной Jesdom-среде Jest. Пожалуйста, убедитесь, что вы прочитали документы Mon goose по настройке Jest для тестирования Node.js приложений: http://mongoosejs.com/docs/jest.html

Я прочитал документы и сказал, что установите testEnvironment в качестве 'узла' в файле конфигурации Jest, что я уже делаю. Это мой файл jest.config. js:

module.exports = {
    testEnvironment: 'node'
};

Однако я получаю предупреждение.

Это мой тестовый скрипт: jest --watchAll

Любая помощь будет оценена. Заранее спасибо

1 Ответ

1 голос
/ 18 апреля 2020

Причина, по которой вы получаете эту ошибку, заключается в следующей строке:

let user = User.findById(req.params.userId)

findById() - это асинхронный метод, поэтому вы должны вставить в код ключевое слово await, например так:

let user = await User.findById(req.params.userId)

Поскольку ваш код на самом деле не ожидает ответа от findById(), что переменная user равна undefined, следовательно, user.save() действительно не является функцией. Вы можете попробовать напечатать console.log(user), и это будет undefined.

Чтобы избежать этого сообщения "Mongoose: looks like you're trying to test a Mongoose app with Jest's...", вам нужно настроить Jest в вашем package.json, например:

"jest": {
  "testEnvironment": "node"
},
...