如何导入配置文件,以便在 Jest 测试下通过构建的捆绑包和模块找到它?



我有一个用TypeScript编写的Node项目,它使用Rollup作为捆绑器,Jest作为单元测试框架。它具有以下结构(我省略了我认为与问题无关的内容):

__tests__
greeter.test.ts
config.json
config
template.config.json
src
modules
greeter.ts
index.ts
jest.config.ts
package.json
tsconfig.json

src/index.ts:

import { greeter } from './modules/greeter'
console.log(greeter('Bojan'))

src/modules/greeter.ts:

const config = require('./config.json')
const greeting = config.greeting;
console.log(greeting)
export function greeter(name: string): string {
return greeting + ", " + name
}

__tests__/greeter.test.ts:

import {greeter} from '../src/modules/greeter';
test('greeter uses greeting specifies in the configuration file', () => {
expect(greeter('ABC')).toBe('hi, ABC');
});
test('greeter uses the name specified as its runtime argument', () => {
expect(greeter('ABC')).toContain('ABC');
});

jest.config.js:

module.exports = {
"verbose": true,
"transform": {
"^.+\.tsx?$": "ts-jest"
},
// "moduleDirectories": [
//     "node_modules", 
//     "<rootDir>/__tests__/"
// ],
// "modulePaths": [
//     "<rootDir>/__tests__/"
// ]
};

package.json:

{
...
"main": "index.js",
"scripts": {
"clean": "rm -rf ./build/",
"test": "jest --verbose --coverage --debug --env node",
"build": "npx rollup -c",
"start": "node ./build/app.js"
},
...
"devDependencies": {
"@types/jest": "^24.0.11",
"@types/node": "^11.13.0",
"jest": "^24.7.1",
"rollup": "^1.9.0",
"rollup-plugin-copy": "^1.0.0",
"rollup-plugin-typescript": "^1.0.1",
"ts-jest": "^24.0.2",
"tslib": "^1.9.3",
"typescript": "^3.4.2"
},
"dependencies": {}
}

这个想法是构建创建app.js捆绑包,该捆绑包从应该位于同一目录中的config.json读取配置。

config.json:

{
"greeting": "hi"
} 

捆绑app.js包含:

var config = require('./config.json');

。运行app.js工作正常(当提供config.json时),但是当我运行npm test(或只是npx jest)开玩笑错误时:

FAIL  __tests__/greeter.test.ts
● Test suite failed to run
Cannot find module './config.json' from 'greeter.ts'
However, Jest was able to find:
'../src/modules/greeter.ts'
You might want to include a file extension in your import, or update your 'moduleFileExtensions', which is currently ['js', 'json', 'jsx', 'ts', 'tsx', 'node'].
See https://jestjs.io/docs/en/configuration#modulefileextensions-array-string
> 1 | const config = require('./config.json')
|                ^
2 | const greeting = config.greeting;
3 | console.log(greeting)
4 | 
at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:229:17)
at Object.<anonymous> (src/modules/greeter.ts:1:16)
Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        1.03s
Ran all test suites.

为了纠正此错误,我需要将config.json(仅用于单元测试)保留在greeter.ts旁边(src/modules),但我想将其保留在__tests__中。我试图更改 Jest 配置文件中的模块目录模块路径无济于事。

有没有办法在 Jest 测试下使config.json对模块greeter.ts可见,同时在运行时保持其从捆绑app.js的可见性?

简短的回答是否定的。 您不能要求不存在的文件。

更长的答案 - 我不清楚你为什么要这样做。 无论测试文件结构如何,源代码都应该是完整的。 您不会引用不存在的文件,当您从src/modules/greeter.tsrequire('./config.json')src/modules/config.json不存在时,您正在执行此操作。

因此,我建议将config.json的副本移动到您的modules目录中,然后在您的 jest 文件中使用beforeAll,如果您需要config.json的内容因测试目的而异。

希望这有帮助!

最新更新