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

Posted

技术标签:

【中文标题】如何导入配置文件,以便在 Jest 测试下的构建包和模块都可以找到它?【英文标题】:How to import a config file so it can be found both by built bundle and module under Jest test? 【发布时间】:2019-08-30 16:19:26 【问题描述】:

我有一个用 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 配置文件中更改 moduleDirectoriesmodulePaths 无济于事。

有没有办法让 config.json 在 Jest 测试下对 greeter.ts 模块可见,同时在运行时从包 app.js 中保持可见性?

【问题讨论】:

你有解决办法吗? 【参考方案1】:

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

更长的答案 - 我不清楚你为什么要这样做。无论测试文件结构如何,您的源代码都应该是完整的。您不会引用不存在的文件,这就是您在 src/modules/greeter.ts 不存在 src/modules/greeter.ts 时所做的事情。

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

希望这会有所帮助!

【讨论】:

以上是关于如何导入配置文件,以便在 Jest 测试下的构建包和模块都可以找到它?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 jest jsdom 环境?

如何使用 Jest 测试导入/导出?

Jest - 模拟函数,从另一个文件导入

如何在 Jest 测试中使用我的 webpack 的 html-loader 导入?

如何制作配置文件以导入相同的模块以进行多个玩笑测试?

jest.mock():如何使用工厂参数模拟 ES6 类默认导入