jestjs - undefined returnerat vid användning av identity-obj-proxy med TypeScript och jest
Jag använder jest med TypeScript i mina projekt. Jag får undefined för alla mina .ts-filer när jag använder identity-obj-proxy, men .js-filer fungerar som förväntat.
Det här är min 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"
]
}
Detta är min jest-konfiguration:
"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
}
}
}
Min testfil (.ts):
import styles from './Somefile.module.scss';
describe('Test identity proxy', () => {
test('undefined returned', () => {
expect(styles.notundefined).toBe(undefined);
}
});
Om jag sparar filen som .js verkar allt fungera, men inte i .ts- eller .tsx-filer.
Svar #1
Som @Nathanael misstänker, tror jag att det finns en bugg i identity-object-proxy-modulen.
I mitt fall fungerade det dock inte när jag använde:
import * as styles from './Somefile.module.scss';Istället följde jag @Nathanaels länk och blev glad över att hitta @joaovieiras lösning. Han skapade sin egen version av 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;
},
},
);
som han inkluderade i jest.config.js enligt följande:
module.exports = {
...
moduleNameMApper: {
'\\.(jpg|jpeg|png|gif|webp|svg)$': 'identity-obj-proxy',
'\\.(css|scss)$': '<rootDir>/.jest/identity-obj-proxy-esm.js',
}
};
För att se hans fulla svar, gå till https://github.com/keyz/identity-obj-proxy/issues/8#issuecomment-430241345
Svar #2
Jag använder Jest 24 och jag har stött på ett liknande problem (om inte samma problem i annan skepnad)
När jag inkluderar SASS- eller CSS-filer i min JS genom att använda en ES6-import stötte jag på problem, som tur var fanns det en enkel lösning.
Som Jest-dokumentationen rekommenderar, lägg till följande omvandling i din package.json
"transform": {
"\\.(css|less|sass|scss)$": "<rootDir>/test/mock/styleMock.js"
}
Vidare enligt instruktionerna på Jest-sidan, skapa filen styleMock.js, men istället för att bara returnera ett objekt eller en sträng, inkludera en 'process'-funktion som returnerar en sträng för att lösa problemet, något liknande detta.
module.exports = {
process: function() {
return "";
}
};
Detta kommer att tillfredsställa Jest om ditt mål bara är att fortsätta skriva tester (eller fixa om du råkar migrera från ett äldre ramverk som jag har gjort). CSS ES6-importerna kommer inte längre vara ett problem.
Förhoppningsvis ger detta en något mer uppdaterad version av de tidigare lösningarna som "nästan fungerade" för mig!
