我正在使用 jest 测试我的 Node.js API。此 API 是用于管理任务的 Express 应用程序。它具有注册/登录功能,仅允许经过身份验证的用户使用该应用程序。它有一个用于注册新用户的端点,并且存在许多端点,它们使用快速中间件通过 JWT 验证用户身份验证。我jose-node-cjs-runtime@^3.15.5
安装了用于 JWT 生成和验证的包。
如果我使用dev
script运行项目env-cmd -f ./config/dev.env nodemon src/index.js
,则没有问题并且运行良好。我正在尝试使用 jest 测试文件来测试用户注册,该文件使用superagent
包来测试端点。我正在使用测试脚本env-cmd -f ./config/test.env jest --watch
来运行测试。此命令显示以下错误并且测试失败:
FAIL tests/user.test.js
● Test suite failed to run
Cannot find module 'jose-node-cjs-runtime/jwt/sign' from 'src/models/user.js'
Require stack:
src/models/user.js
src/routers/user.js
src/app.js
tests/user.test.js
3 | const bcrypt = require('bcryptjs');
4 | // library for signing jwt
> 5 | const { SignJWT } = require('jose-node-cjs-runtime/jwt/sign');
| ^
6 | // library for generating symmetric key for jwt
7 | const { createSecretKey } = require('crypto');
8 | // task model
at Resolver.resolveModule (node_modules/jest-resolve/build/resolver.js:313:11)
at Object.<anonymous> (src/models/user.js:5:21)
Test Suites: 1 failed, 1 total
Tests: 0 total
Snapshots: 0 total
Time: 3.385 s
Ran all test suites related to changed files.
我无法弄清楚为什么会导致此错误。请帮助我找到解决方案。
我使用的是 Node.js 版本 16.7.0 并收到此错误。我今天升级了我的 Node.js 版本。我当前的 Node.js 版本是 16.9.0。升级 Node.js 版本后,我也收到此错误。以下是项目的 package.json 文件内容:
{
"name": "task-manager",
"version": "1.0.0",
"description": "",
"main": "index.js",
"engines": {
"node": ">=16.7.0"
},
"scripts": {
"start": "node src/index.js",
"dev": "env-cmd -f ./config/dev.env nodemon src/index.js",
"test": "env-cmd -f ./config/test.env jest --watch"
},
"jest": {
"testEnvironment": "node",
"roots": [
"<rootDir>"
],
"modulePaths": [
"<rootDir>"
],
"moduleDirectories": [
"node_modules"
]
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@sendgrid/mail": "^7.4.6",
"bcryptjs": "^2.4.3",
"express": "^4.17.1",
"jose-node-cjs-runtime": "^3.15.5",
"mongodb": "^4.1.1",
"mongoose": "^6.0.2",
"multer": "^1.4.3",
"sharp": "^0.29.0",
"validator": "^13.6.0"
},
"devDependencies": {
"env-cmd": "^10.1.0",
"jest": "^27.1.0",
"nodemon": "^2.0.12",
"supertest": "^6.1.6"
}
}
以下是内容src/models/user.js
:
const mongoose = require('mongoose');
const validator = require('validator');
const bcrypt = require('bcryptjs');
// library for signing jwt
const { SignJWT } = require('jose-node-cjs-runtime/jwt/sign');
// library for generating symmetric key for jwt
const { createSecretKey } = require('crypto');
// task model
const Task = require('./task');
...
内容src/tests/user.test.js
:
const request = require('supertest');
const app = require('../src/app');
describe('user route', () => {
test('should signup a new user', async () => {
await request(app)
.post('/users')
.send({
name: '__test_name__',
email: '__test_email__',
password: '__test_password__',
})
.expect(201);
});
});