开玩笑TypeError:Document.save不是函数

时间:2020-04-18 16:20:36

标签: 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.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设置为“ node”,这已经在做了。这是我的jest.config.js文件:

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

但是我一直收到警告。

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

任何帮助都会得到帮助。预先感谢

1 个答案:

答案 0 :(得分: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"
},