undefined 在将 identity-obj-proxy 与 typescript 与 jest 一起使用时返回
undefined returned when using identity-obj-proxy with typescript with jest
我在我的项目中使用 jest 和 typescript。我使用 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 文件中无效。
尝试将您的 scss 文件导入为
import * as styles from './Somefile.module.scss';
identity-obj-proxy 存在问题,导致标准导入语法无法在 TypeScript 中使用,但由于某种原因,import * as 符号可以正常工作。
正如@Nathanael 所怀疑的那样,我相信 identity-object-proxy 模块中存在错误。
但在我的情况下,它在使用时不起作用:
import * as styles from './Somefile.module.scss';
相反,我遵循了@Nathanael 的 link 并且很高兴找到@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
我正在使用 Jest 24,并且 运行 遇到了类似的问题(如果不是同一个问题,不同的衣服)
当我使用 ES6 导入在我的 JS 中包含 SASS 或 CSS 文件时,我 运行 遇到了问题,幸运的是有一个简单的解决方案。
按照 Jest 文档的建议,将以下 t运行sform 添加到您的 package.json
"transform": {
"\.(css|less|sass|scss)$": "<rootDir>/test/mock/styleMock.js"
}
根据 Jest 网站上的说明,创建 styleMock.js 文件,但不是 return 只是一个对象或字符串,而是包含一个 'process' 函数,该函数 returns 一个字符串来解决这个问题,就像这样。
module.exports = {
process: function() {
return "";
}
};
如果您的目标只是继续编写测试(或者如果您碰巧像我一样从旧框架迁移过来,则修复),这将安抚 Jest。 css ES6 导入将不再是问题。
希望这提供了对我来说 "almost worked" 以前的解决方案稍微更新的版本!
我在我的项目中使用 jest 和 typescript。我使用 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 文件中无效。
尝试将您的 scss 文件导入为
import * as styles from './Somefile.module.scss';
identity-obj-proxy 存在问题,导致标准导入语法无法在 TypeScript 中使用,但由于某种原因,import * as 符号可以正常工作。
正如@Nathanael 所怀疑的那样,我相信 identity-object-proxy 模块中存在错误。
但在我的情况下,它在使用时不起作用:
import * as styles from './Somefile.module.scss';
相反,我遵循了@Nathanael 的 link 并且很高兴找到@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
我正在使用 Jest 24,并且 运行 遇到了类似的问题(如果不是同一个问题,不同的衣服)
当我使用 ES6 导入在我的 JS 中包含 SASS 或 CSS 文件时,我 运行 遇到了问题,幸运的是有一个简单的解决方案。
按照 Jest 文档的建议,将以下 t运行sform 添加到您的 package.json
"transform": {
"\.(css|less|sass|scss)$": "<rootDir>/test/mock/styleMock.js"
}
根据 Jest 网站上的说明,创建 styleMock.js 文件,但不是 return 只是一个对象或字符串,而是包含一个 'process' 函数,该函数 returns 一个字符串来解决这个问题,就像这样。
module.exports = {
process: function() {
return "";
}
};
如果您的目标只是继续编写测试(或者如果您碰巧像我一样从旧框架迁移过来,则修复),这将安抚 Jest。 css ES6 导入将不再是问题。
希望这提供了对我来说 "almost worked" 以前的解决方案稍微更新的版本!