2017-12-01 14 views
2

내 응용 프로그램에서 npm을 통해 deepmerge을 가져오고 있습니다. 환경에는 webpack, babel, typescript, 반응, redux, jest가 포함됩니다.Jest 및 ES2015 가져 오기. jest가 package.json의 pkg.module 선언을 준수하도록하십시오.

Jest가 ES2015 가져 오기 작업을 잘 할 수 있지만 Jest는 deepmerge의 es.js 버전 사용을 거부합니다 (참조 용으로 pkg.module 참조).

간략히 말하자면 deepmerge는 CommonJS 호환 환경 및 RequireJS와 같은 라이브러리에 대해 ES2015 배포본과 다른 배포판을 모두 컴파일하는 rollup 패키지를 사용합니다. 그들은 다음과 같이 deepmerge의 package.json에서 참조 :

"main": "dist/umd.js", 
    "module": "dist/es.js" 

이 방법을 응용 프로그램에 deepmerge 가져올 때, 컴파일러가 실행되는 환경에 따라 올바른 파일을 사용할 수있을만큼 현명해야한다.

이것은 아마도 지나치게 단순화되었지만 요점을 알아야합니다.

이제 내 응용 프로그램이 모든 내용을 올바르게 파싱하고 올바른 버전의 스크립트가 컴파일되고 있습니다 (es.js). Jest는 잘못된 파일 (umd.js)을 가져 오기 때문에 테스트가 중단됩니다 (TypeError: deepmerge_1.default is not a function).

나는 import deepmerge from 'deepmerge';에 의존하기보다는 import 문에서 올바른 파일의 경로를 지정하는 것과 같은 해결 방법을 발견했습니다. 그러나 패키지의 관리자가 경로, 파일 이름 또는 기타를 변경하기로 결정한 경우에 대비하여 더 나은 미래 보장 방법이 있어야한다고 생각합니다.

아이디어가 있으십니까?


{ 
    "presets": ["env", "react"], 
    "plugins": [ 
    "react-css-modules" 
    ] 
} 

답변

0

편집 .babelrc jest.config.json는

{ 
    "transformIgnorePatterns": [ 
    "<rootDir>/node_modules/(?!deepmerge)" 
    ], 
    "transform": { 
    ".(js|ts|tsx)": "<rootDir>/node_modules/ts-jest/preprocessor.js" 
    }, 
    "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$", 
    "moduleFileExtensions": ["ts", "tsx", "js", "jsx", "json"] 
} 

:이 패키지의 모듈 필드를 사용하므로 조금 불통. jest.mock의 hoisting 때문에 도우미 기능을 수행 할 수 없었으며 이름을 세 번 반복해야했습니다.

jest.mock('modulename',() => require('modulename/' + require('modulename/package.json').module)); 

원래 답변 : package.module을 사용하여 우리 자신의 내부 라이브러리 중 하나를 가져올 때

저도 같은 문제로 실행했습니다. 내 이해는 JEST가 노드에서 실행되기 때문에 (그리고 우리의 테스트는 WebPack을 거치지 않는다) package.module은 무시되고 대신 package.main이 사용된다는 것이다.

나는 시험 내에서 사용하여이 모의 객체를 해결 할 수 있었다 :

jest.mock('modulename',() => require('modulename/builds/es')); 

이 pkg.module를 사용하는 각 모듈에 대해 할 지루하지만, 수동으로 내용을 조롱 비트와 난을 남길 수 있습니다 테스트 된 코드의 가져 오기는 그대로 유지됩니다.

다른 접근법은 모듈의 버전을 commonjs 버전에 매핑/프록시하는 변환을 작성하는 것이지만 너무 멀게 만들지는 못합니다.

앞으로 더 나은 솔루션을 기대합니다.