1

我的jsconfig.json文件中有以下配置:

{
  "compilerOptions": {
    "baseUrl": "./src"
  },
  "include": ["src"]
}

这让我可以这样做:

import { App } from 'components'
import * as actions from 'actions/app.actions'

而不是这个:

import { App } from '../components'
import * as actions from '../actions/app.actions'

为了开始进行单元测试,我创建了一个简单App.test.jsxsrc/components/tests

import { render } from '@testing-library/react'
import { App } from 'components'

it('renders without crashing', () => {
  render(<App />)
})

但是,当我运行yarn test(这是糖react-scripts test)时,它会抛出这个丑陋的错误:

 FAIL  src/components/tests/App.test.jsx
  ● Test suite failed to run

    Your application tried to access components, but it isn't declared in your dependencies; 
this makes the require call ambiguous and unsound.

    Required package: components (via "components")
    Required by: C:\Users\Summer\Code\sandbox\src\components\tests\

      23714 |     enumerable: false
      23715 |   };
    > 23716 |   return Object.defineProperties(new Error(message), {
            |                                  ^
      23717 |     code: { ...propertySpec,
      23718 |       value: code
      23719 |     },

      at internalTools_makeError (.pnp.js:23716:34)
      at resolveToUnqualified (.pnp.js:24670:23)
      at resolveRequest (.pnp.js:24768:29)
      at Object.resolveRequest (.pnp.js:24846:26)

似乎 Jest(或 Yarn?)认为components是一个节点包,因为它不知道我的jsconfig.json. 有没有办法让它知道?还是我必须在 0% 覆盖率和相对进口之间做出选择?

我试过"moduleNameMapper""jest"package.json的文档中解释,但它没有帮助。我得到了同样的错误+一个之后。

我也尝试将components测试文件更改为,../components但随后它抱怨组件actions/app.actions内部是哪个<App />

模块名称映射器配置:

/* package.json */
{
  /* ... */
  "jest": {
    "moduleNameMapper": {
      "actions(.*)$": "<rootDir>/src/actions$1",
      "assets(.*)$": "<rootDir>/src/assets$1",
      "components(.*)$": "<rootDir>/src/components$1",
      "mocks(.*)$": "<rootDir>/src/mocks$1",
      "pages(.*)$": "<rootDir>/src/pages$1",
      "reducers(.*)$": "<rootDir>/src/reducers$1",
      "scss(.*)$": "<rootDir>/src/scss$1",
      "store(.*)$": "<rootDir>/src/store$1",
      "themes(.*)$": "<rootDir>/src/themes$1",
      "api": "<rootDir>/src/api.js",
    }
  }
}
4

1 回答 1

1

这是因为 Yarn 控制了解析管道,因此不知道来自第三方配置的解析指令(如moduleNameMapper)。

不过,这并不是说您没有选择 - 具体来说,这里的解决方法是避免moduleNameMapper,而是利用内置的link:依赖协议。这还有其他优点,例如与所有工具(TS、Jest、ESLint...)兼容,无需将别名移植到每种配置格式。

另请参阅:为什么link:建议使用该协议而不是路径映射的别名?

于 2021-04-25T20:19:36.170 回答