这是我在
jest
中的 package.json
配置:
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"moduleDirectories":["node_modules", "src"], // tried to solve the issue like that
"rootDir": "src",
"testRegex": ".spec.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
AFAIK Nest 不添加 jest.config 文件,所以 package.json 是我最好的选择。
但是这样做之后,我的代码仍然失败:
yarn run v1.22.5
$ jest
FAIL src/auth/auth.service.spec.ts
● Test suite failed to run
Cannot find module 'src/auth/auth.service' from 'auth/auth.service.spec.ts'
3 | import * as moment from 'moment';
4 | import { RedisService } from '@custom/redis-client'; // this is in node_modules
> 5 | import { AuthService } from 'src/auth/auth.service';
| ^
6 | import { ConfigService } from 'src/config/config.service';
7 |
8 | describe('AuthService', () => {
at Resolver.resolveModule (../node_modules/jest-resolve/build/index.js:306:11)
at Object.<anonymous> (auth/auth.service.spec.ts:5:1)
Test Suites: 1 failed, 1 total
Tests: 0 total
Snapshots: 0 total
Time: 3.486 s
Ran all test suites.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
我还尝试将其添加到
jest
配置以及 tsconfig 中:
"moduleNameMapper": {
"src/(.*)": "<rootDir>/$1",
"tests/(.*)": "<rootDir>/__tests__/$1"
},
但是通过这段代码我得到:
yarn run v1.22.5
$ jest
FAIL src/auth/auth.service.spec.ts
● Test suite failed to run
Configuration error:
Could not locate module ./src/redis/redis.health.indicator mapped as:
/home/aironside/Documents/sygnum/dev-environment/api-layer/src/$1.
Please check your configuration for these entries:
{
"moduleNameMapper": {
"/src\/(.*)/": "/home/aironside/Documents/sygnum/dev-environment/api-layer/src/$1"
},
"resolver": undefined
}
at createNoMappedModuleFoundError (../node_modules/jest-resolve/build/index.js:551:17)
at Object.<anonymous> (../node_modules/@sygnum/redis-client/index.ts:1:1)
Test Suites: 1 failed, 1 total
Tests: 0 total
Snapshots: 0 total
Time: 3.183 s
Ran all test suites.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
我错过了什么?
我的完整 tsconfig:
{
"compilerOptions": {
"module": "commonjs",
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "es2017",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./",
"incremental": true,
"rootDir": "./",
}
}
我也有同样的问题。 请将
"rootDir": "src"
更改为 "rootDir": "./"
并在您的 "modulePaths": ["<rootDir>"].
中添加
pakage.json
最后你的
jest
对象应该看起来像这样:
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"moduleDirectories": [
"node_modules",
"src"
],
"rootDir": "./", // ***** CHANGE "rootDir": "src" to "rootDir": "./"
"modulePaths": ["<rootDir>"], // ***** ADD "modulePaths": ['<rootDir>'],
"testRegex": ".spec.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
这对我来说效果很好。我希望你也一样!!
我在 Typescript 项目中使用 ts-jest 模块来处理 Jest。我使用 Jest 进行单元测试和 E2E 测试(目前),因此我为每个测试都有不同的配置文件,并使用通用的基本模块来避免重复设置。
我的测试导入文件时不需要指定src/,只需指定其下的正常路径即可。 此外,此配置还具有支持在源代码中使用 Typescript 路径(@LIBRARY、@MODULE 等)的插件。
jest-base.config.js
const tsconfig = require('./tsconfig.json');
const moduleNameMapper = require('tsconfig-paths-jest')(tsconfig);
module.exports = {
moduleNameMapper,
preset: 'ts-jest',
testEnvironment: 'node',
rootDir: './',
collectCoverage: true,
collectCoverageFrom: [
'<rootDir>/**/*.ts',
'!<rootDir>/**/*.interface.ts',
'!<rootDir>/**/*.mock.ts',
'!<rootDir>/**/*.module.ts',
'!<rootDir>/**/__mock__/*',
'!<rootDir>/src/main.ts'
],
coverageProvider: 'v8',
coverageReporters: [
'clover',
'json',
'lcov',
'text',
'text-summary'
],
resetModules: true,
setupFiles: [
'dotenv/config'
],
// Add the community jest-extended matchers
setupFilesAfterEnv: [
'jest-extended'
],
verbose: false
};
然后对于单元测试,我使用以下 jest.config.js 以及 package.json 脚本选项
jest --watchAll --config ./jest.config.js
jest.config.js
const JestBaseConfiguration = require('./jest-base.config');
module.exports = Object.assign(JestBaseConfiguration, {
// A list of paths to directories that Jest should use to search for files in
roots: [
'<rootDir>/src',
],
coverageDirectory: '<rootDir>/docs/coverage',
coverageThreshold: {
global: {
branches: 80,
functions: 50,
lines: 50,
statements: 50
}
},
testTimeout: 30000 // Set in each config in case different values are needed
});
对于端到端测试,我使用以下 jest-e2e.config.js 以及 package.json 脚本选项
jest --watchAll --config ./jest-e2e.config.js
jest-e2e.config.js
const JestBaseConfiguration = require('./jest-base.config');
module.exports = Object.assign(JestBaseConfiguration, {
moduleFileExtensions: ['js', 'json', 'ts'],
testRegex: '.e2e-spec.ts$',
transform: {
'^.+\\.(t|j)s$': 'ts-jest'
},
// A list of paths to directories that Jest should use to search for files in
roots: [
'<rootDir>/test'
],
coverageDirectory: '<rootDir>/docs/e2e-coverage',
coverageThreshold: {
global: {
branches: 5,
functions: 5,
lines: 5,
statements: 5
}
},
testTimeout: 30000 // Set in each file in case different values are needed
});
对于 e2e 测试,更新
tests/jest-e2e.json
如下,为我解决了问题。
{
"moduleFileExtensions": ["js", "json", "ts"],
"rootDir": "../", # <--- Change this line
"modulePaths": ["<rootDir>"], # <---- Add this line
"testEnvironment": "node",
"testRegex": ".e2e-spec.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
}
}