Javascript Jest TypeError:Document.save不是函数

Javascript Jest TypeError:Document.save不是函数,javascript,node.js,unit-testing,express,jestjs,Javascript,Node.js,Unit Testing,Express,Jestjs,我正在尝试为一个有用户模型的Express应用程序编写一些测试。我的一个方法如下所示: 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(); 代码按应有的方式运行,但当我测试它时,Jest抱怨: TypeError:user.sa

我正在尝试为一个有用户模型的Express应用程序编写一些测试。我的一个方法如下所示:

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();
代码按应有的方式运行,但当我测试它时,Jest抱怨:

TypeError:user.save不是一个函数

现在我正在模仿我的整个用户模型,如下所示:

let user = await User.findById(req.params.userId)
"jest": {
  "testEnvironment": "node"
},
jest.mock('../../models/User')

我试图像这样模拟save函数,但没有改变:

jest.spyOn(User.prototype, 'save')
      .mockImplementationOnce(() => Promise.reject('fail update'))
正如我之前所说,代码运行良好。我在运行服务器时没有收到此错误

然而,有一件奇怪的事情发生了:当我运行测试时,我从猫鼬那里得到了这个警告

Mongoose:看起来您正在尝试使用Jest的默认jsdom测试环境测试Mongoose应用程序。请确保您阅读了Mongoose关于配置Jest以测试Node.js应用程序的文档:

我阅读了文档,上面说的是在Jest配置文件中将TestenEnvironment设置为“node”,我已经在这么做了。这是我的jest.config.js文件:

module.exports = {
    testEnvironment: 'node'
};
然而,我不断得到警告

这是我的测试脚本:
jest--watchAll


任何帮助都将被告知。提前感谢

您收到该错误的原因如下:

let user = User.findById(req.params.userId)
findById()
是一种异步方法,因此必须在代码中放入
wait
关键字,如下所示:

let user = await User.findById(req.params.userId)
"jest": {
  "testEnvironment": "node"
},
由于您的代码并没有真正等待
findById()
的响应,
user
变量是
未定义的
,因此
user.save()
确实不是一个函数。您可以尝试打印
console.log(user)
,它将是
未定义的

要避免出现此消息“
Mongoose:看起来您正试图使用Jest测试Mongoose应用程序…”。
“您必须在
包.json中配置Jest,如下所示:

let user = await User.findById(req.params.userId)
"jest": {
  "testEnvironment": "node"
},

实际上,等待是一个输入错误,我的实际代码中有一个等待。但是你的评论帮我弄明白了-我正在搜索一个数据库中没有注册的用户。我将尝试模拟findById返回值,我会没事的。谢谢不客气,你解决了猫鼬的信息了吗?我很乐意帮忙。如果这个或任何答案已经解决了你的问题,请考虑点击复选标记。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。