【问题标题】:Jest TypeError: Document.save is not a functionJest TypeError: Document.save 不是一个函数
【发布时间】:2020-08-01 04:23:00
【问题描述】:

我正在尝试为我有一个用户模型的 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 is not a function

现在我正在像这样嘲笑我的整个用户模型:

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

我试图像这样模拟保存功能,但没有任何改变:

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

正如我之前所说,代码运行良好。我在运行服务器时没有收到此错误。

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

Mongoose:看起来您正在尝试使用 Jest 的默认 jsdom 测试环境来测试 Mongoose 应用程序。请务必阅读 Mongoose 关于配置 Jest 以测试 Node.js 应用程序的文档:http://mongoosejs.com/docs/jest.html

我阅读了文档,它说的是在 Jest 配置文件中将 testEnvironment 设置为“节点”,我已经在这样做了。这是我的 jest.config.js 文件:

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

但是我不断收到警告。

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

我们将不胜感激。提前致谢

【问题讨论】:

    标签: javascript node.js unit-testing express jestjs


    【解决方案1】:

    您收到该错误的原因是这一行:

    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...”,您必须在 package.json 中配置 Jest,如下所示:

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

    【讨论】:

    • 实际上 await 是一个错字,我的实际代码中有一个 await。但是您的评论帮助我弄清楚 - 我正在寻找一个在数据库中没有注册的用户。我会尝试模拟 findById 返回值,我应该没问题。谢谢!!
    • 不客气,你解决了 Mongoose 的消息了吗?
    • 我很乐意提供帮助。如果此答案或任何答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 2021-05-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多