4

我在我的项目中使用 jest 和打字稿。我使用 identity-obj-proxy 对我的所有 .ts 文件都未定义,但 .js 文件按预期工作。

这是我的 tsconfig.json:

{
  "compilerOptions": {
    "target": "es5",
    "forceConsistentCasingInFileNames": true,
    "module": "esnext",
    "moduleResolution": "node",
    "jsx": "react",
    "declaration": true,
    "sourceMap": true,
    "experimentalDecorators": true,
    "skipLibCheck": true,
    "outDir": "lib",
    "typeRoots": [
      "./node_modules/@types",
      "./node_modules/@microsoft"
    ],
    "types": [
      "es6-promise",
      "webpack-env"
    ],
    "lib": [
      "es5",
      "dom",
      "es2015.collection"
    ]
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "node_modules",
    "lib"
  ]
}

这是我开玩笑的配置:

"jest": {
    "unmockedModulePathPatterns": [
      "React"
    ],
    "moduleFileExtensions": [
      "ts",
      "tsx",
      "js"
    ],
    "transform": {
      "^.+\\.(d\\.ts|ts|tsx)$": "ts-jest"
    },
    "testMatch": [
      "**/src/**/*.test.+(ts|tsx|js)"
    ],
    "setupFiles": [
      "raf/polyfill"
    ],
    "collectCoverage": true,
    "coverageReporters": [
      "json",
      "lcov",
      "text",
      "cobertura"
    ],
    "coverageDirectory": "<rootDir>/jest",
    "collectCoverageFrom": [
      "**/*.{ts,tsx}",
      "!**/*.d.{ts,tsx}",
      "!**/*.scss.ts",
      "!**/models/**",
      "!**/node_modules*/**"
      "!**/services/http.ts"
    ],
    "moduleNameMapper": {
      "\\.(css|less|scss|sass)$": "identity-obj-proxy",
      "^resx-strings/en-us.json": "<rootDir>/node_modules/@microsoft/sp-core-library/lib/resx-strings/en-us.json"
   },
    "reporters": [
      "default",
      "jest-junit"
    ],
    "coverageThreshold": {
      "global": {
        "branches": 50,
        "functions": 75,
        "lines": 75,
        "statements": 75
      }
    }
  }

我的测试文件(.ts):

import styles from './Somefile.module.scss';

describe('Test identity proxy', () => {
  test('undefined returned', () => {
    expect(styles.notundefined).toBe(undefined);
  }
});

如果我将文件另存为 .js ,那么一切似乎都可以正常工作,但不能在 .ts 或 .tsx 文件中。

4

3 回答 3

3

正如@Nathanael 怀疑的那样,我相信identity-object-proxy模块中存在错误。

但是在我的情况下,它在使用时不起作用:

import * as styles from './Somefile.module.scss';

相反,我关注了@Nathanael 的链接,很高兴找到@joaovieira 的解决方法。他创建了自己的身份对象代理版本

module.exports = new Proxy(
  {},
  {
    get: function getter(target, key) {
      if (key === '__esModule') {
        // True instead of false to pretend we're an ES module.
        return true;
      }
      return key;
    },
  },
);

他将其包含在 jest.config.js 中,如下所示:

module.exports = {
...
  moduleNameMApper: {
    '\\.(jpg|jpeg|png|gif|webp|svg)$': 'identity-obj-proxy',
    '\\.(css|scss)$': '<rootDir>/.jest/identity-obj-proxy-esm.js',
  }
};

要查看他的完整答案,请访问https://github.com/keyz/identity-obj-proxy/issues/8#issuecomment-430241345

于 2019-03-07T10:44:04.100 回答
3

我正在使用 Jest 24,我遇到了类似的问题(如果不同衣服的问题不同)

当我使用 ES6 导入在我的 JS 中包含 SASS 或 CSS 文件时,我遇到了问题,幸运的是有一个简单的解决方案。

正如 Jest 文档建议的那样,将以下转换添加到您的 package.json

"transform": { 
    "\\.(css|less|sass|scss)$": "<rootDir>/test/mock/styleMock.js"
}

根据 Jest 站点上的说明,创建 styleMock.js 文件,但不要只返回一个对象或字符串,而是包含一个“处理”函数,该函数返回一个字符串来解决问题,就像这样。

module.exports = {
  process: function() {
    return "";
  }
};

如果您的目标是继续编写测试(或者如果您碰巧像我一样从较旧的框架迁移),这将安抚 Jest。css ES6 导入将不再是问题。

希望这提供了对我来说“几乎有效”的先前解决方案的稍微更新的版本!

于 2019-12-20T17:03:20.710 回答
2

尝试将您的 scss 文件导入为

import * as styles from './Somefile.module.scss';

identity-obj-proxy 存在一个问题,它会阻止标准导入语法在 TypeScript 中工作,但由于某种原因, import * as 表示法可以正常工作。

https://github.com/keyanzhang/identity-obj-proxy/issues/8

于 2018-10-19T21:34:50.090 回答