Как заставить тест, выполненный с помощью ts-jest, использовать node_modules в другой папке? - PullRequest
0 голосов
/ 19 июня 2019

У меня есть следующая структура папок, уникальной особенностью которой является общий доступ по символической ссылке.

root
├── projects
│   ├── A
│   │   ├── node_modules
│   │   ├── common (symlink ../common)
│   │   ├── srcA.ts
│   │   └── testA.ts
│   ├── B
│   │   ├── node_modules
│   │   ├── common (symlink ../common)
│   │   ├── srcB.ts
│   │   └── testB.ts
│   └── common
│       ├── srcC.ts
│       └── testC.ts

Обратите внимание, что папка с символическими ссылками common не имеет своих собственных узлов_модулей. Вместо этого он использует node_modules каждого проекта отдельно. Эта настройка прекрасно работает во время обычной работы, но во время тестов я получаю ошибки.

Изначально я надеялся, что смогу просто использовать jest таким же образом, как я запускаю проекты. Однако шутка не может следовать по символическим ссылкам . В связи с этим я сделал следующее jest.config.js (обратите внимание, что roots загружает тесты как из src проекта, так и из common):

module.exports = {
  rootDir: "./",
  roots: ["../common/", "src/"],
  preset: 'ts-jest',
  resolver: "jest-pnp-resolver",
  setupFiles: ["react-app-polyfill/jsdom"],
  testMatch: ["**/?(*.)(spec|test).{js,jsx,ts,tsx}"],
  testEnvironment: "jsdom",
  testURL: "http://localhost",
  transform: {
    "^.+\\.(js|jsx|ts|tsx)$": "ts-jest",
    "^.+\\.css$": "<rootDir>/scripts/config/jest/cssTransform.js",
    "^(?!.*\\.(js|jsx|ts|tsx|css|json)$)": "<rootDir>/scripts/config/jest/fileTransform.js",
  },
  transformIgnorePatterns: ["[/\\\\]node_modules[/\\\\].+\\.(js|jsx|ts|tsx)$", "^.+\\.module\\.(css|sass|scss)$"],
  moduleNameMapper: {
    "^react-native$": "react-native-web",
    "^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy",
    "^src/(.*)": "<rootDir>/src/$1",
    "^common/(.*)": "<rootDir>/common/$1",
  },
  moduleFileExtensions: ["web.js", "js", "web.ts", "ts", "web.tsx", "tsx", "json", "web.jsx", "jsx", "node"],
};

Однако во время тестов testC.ts не может найти node_modules соответствующего проекта. Я сделал несколько попыток заставить ts-jest использовать node_modules проекта:

module.exports = {
  moduleDirectories: ["/home/large-project/projects/A"],
  globals: {
    "ts-jest": {
      tsConfig: {
        baseUrl: "/home/large-project/projects/A",
      },
    },
  },
};

Однако, похоже, это ничего не меняет. Как я могу с помощью ts-jest написать через машинку testC.ts, чтобы использовать node_modules в проекте, в котором я выполняю тест?

...