我正在尝试为具有用户模型的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
任何帮助都会得到帮助。预先感谢
答案 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"
},