前提
React・テストコード初心者です。
親子関係のあるコンポーネントの中の
子コンポーネント内の静的メソッドのテストコードを作成しようとしています。
(jestとenzymeを使用)
子コンポーネントのマウントの記述でTypeError:となり、stackoverflowなどで検索をしてみたのですが、エラーが解消できませんでした。
エラーメッセージ
TypeError: Cannot read property 'createElement' of undefined 317 | 318 | return ( > 319 | <Wrapper ref={rootEl}>
該当のソースコード
テストコードは子コンポーネントだけをテストしようとしています。
enzymeのshallow
も試しましたが同じエラーでテストが止まりました。
typescript
1//selectFile.spec.tsx 2import * as React from "react"; 3import { useSelector, useDispatch } from 'react-redux' 4import { SelectFile } from "./selectFile"; 5import { configure, mount } from "enzyme"; 6import * as Adapter from "enzyme-adapter-react-16"; 7import EnzymeToJson from "enzyme-to-json"; 8 9configure({ adapter: new Adapter() }); 10 11// useSelector,useDispatchのエラーが出たのでmock を追加 12jest.mock('src/selectors') 13jest.mock('react-redux') 14const useSelectorMock = useSelector as jest.Mock 15const useDispatchMock = useDispatch as jest.Mock 16const dummyProps = { 17 select: "basic", 18}; 19describe("dicom-uploader.ts", () => { 20 beforeEach(() => { 21 useSelectorMock.mockReturnValue(10) 22 useDispatchMock.mockReturnValue(jest.fn()) 23 }) 24 afterEach(() => { 25 jest.resetAllMocks(); 26 }) 27 it("should render default SelectFile", () => { 28 const mounted = mount(<SelectFile {...dummyProps} />); 29 // ↑でテストが止まります
コンポーネント(エラーなく動作している)
React
1// 親コンポーネント(一部抜粋) 2return ( 3 <Root> 4 {(() => { 5 switch(...){ 6 return <SelectFile /> // 今回テストしたいコンポーネント 7 default: 8 return <Foo /> 9 } 10 })()} 11 </Root> 12 );
React
1// SelectFile.tsx テストしたいコンポーネント(一部抜粋) 2import styled from "styled-components"; 3import ...省略 4 5const Wrapper = styled.div` 6...省略(cssプロパティ) 7`; 8 9export type Props = {...省略} 10export const SelectFile: React.FC<Props> = () => { 11 const rootEl = useRef<HTMLDivElement>(null); 12 13 const addFunc = (files: File) => { ...省略} // 新たに追加した関数をテストしたい 14 15 const something = useCallback( 16 // ...省略 17 const foo = addFunc(files); 18 ); 19 20 useEffect(() => { 21 return () => { 22 if (rootEl.current) { 23 const { current } = rootEl; 24 current.removeEventListener("drop", onDrop); 25 // ...省略 26 } 27 }; 28 }); 29 30 // その他useSelector、useEffect、useCallbackなどの記述 31 32 return ( 33 <Wrapper ref={rootEl}> <!-- テストではここでエラーとなっている --> 34 <!-- HTML要素、コンポーネントなど --> 35 </Wrapper> 36 ); 37}; 38 39export default DicomUploader;
試したこと
Reactの何かが読み込めていないためcreateElement
がないというエラーになっていると考えました。
既存の構造の都合で子コンポーネントではsrc
以外の場所からもファイルをimportしているため、パスの問題もあるかと思い、
jest.config.jsでモジュールのパス設定を変更してみました。しかし、エラーは解消されませんでした。
diff
1moduleNameMapper: { 2 "^.+\.svg$": "<rootDir>/mocks/icon-mock.tsx", 3 "^.+\.(css|less|scss)$": "identity-obj-proxy", 4+ "^src(.*)$": "<rootDir>/src$1", 5 }, 6+ moduleDirectories: ["node_modules", "<rootDir>/node_modules", "."],
補足情報
パッケージのバージョン
json
1// package.json 2"react": "16.13.1", 3"jest": "26.1.0", 4"enzyme": "3.11.0",
リポジトリ内ではreducerやstoreのテストコードは存在していて、テストはパスしています。
スナップショットも動作しています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/05 16:38
2021/08/06 00:05 編集
2021/08/06 07:57
2021/08/06 08:55 編集
2021/08/08 11:47
2021/08/08 12:28 編集
2021/08/10 04:21 編集
2021/08/10 04:23 編集
2021/08/10 04:26
2021/08/10 10:28
2021/09/15 10:54