undefined возвращается при использовании identity-obj-proxy с машинописным шрифтом с помощью jest
Я использую шутку с машинописью в моих проектах. Я получаю undefined для всех моих файлов.ts, используя identity-obj-proxy, но файлы.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.
1 ответ
Как и подозревает @Nathanael, я считаю, что в модуле identity-object-proxy есть ошибка.
В моем случае, однако, он не работал при использовании:
import * as styles from './Somefile.module.scss';
Вместо этого я перешел по ссылке @ Nathanael и был рад найти обходной путь @joaovieira. Он создал свою собственную версию identity-object-proxy
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.
Я использую Jest 24 и столкнулся с аналогичной проблемой (если не с той же проблемой в другой одежде)
Когда я включаю файлы SASS или CSS в свой JS с помощью импорта ES6, я сталкивался с проблемами, к счастью, было простое решение.
Как рекомендует документация Jest, добавьте следующее преобразование в свой package.json
"transform": {
"\\.(css|less|sass|scss)$": "<rootDir>/test/mock/styleMock.js"
}
В дополнение к инструкциям на сайте Jest создайте файл styleMock.js, но вместо того, чтобы возвращать просто объект или строку, включите функцию "процесса", которая возвращает строку для решения проблемы, что-то вроде этого.
module.exports = {
process: function() {
return "";
}
};
Это успокоит Jest, если ваша цель - просто продолжить писать тесты (или исправлять ошибки, если вам случится переходить со старой структуры, как это было у меня). Импорт css ES6 больше не будет проблемой.
Надеюсь, это дает немного более свежую версию предыдущих решений, которые "почти сработали" для меня!
Попробуйте импортировать файл scss как
import * as styles from './Somefile.module.scss';
Существует проблема с identity-obj-proxy, которая не позволяет стандартному синтаксису импорта работать в TypeScript, но по какой-то причине импорт * как нотация работает нормально.