stateとsetState渡した子コンポーネントのテストで、setStateのpropsの書き方が分からず困っています。
下記のデモは親コンポーネントでstateを管理し、子コンポーネントでstateを操作しているデモです。
テストファイルは、/src/__test__/Input.spec.tsx
です。
demo
テスト用のpropsのsetStateの書き方をご教示いただけないでしょうか。
CodeSandboxではエラーが表示されつつも動いていますが、私が使用しているVSCodeだとsetStateを使うかはともかくpropsを全て設定しないとエラーによりコンパイルができない状況です。
使用しているツール
- React.js
- Jest
- React Testing Library
- TypeScript
ソースコード
Input.spec.tsx
tsx
1import React from "react"; 2import "@testing-library/jest-dom/extend-expect"; 3import { render, cleanup } from "@testing-library/react"; 4 5import Input from "../Input"; 6 7describe("Input", () => { 8 afterEach(cleanup); 9 const props = { 10 currentNum: 0 /* , 11 setCurrentNum: */ 12 }; 13 14 it("render set number", () => { 15 const { getByTestId } = render(<Input {...props} />); 16 expect(getByTestId("current-num")).toHaveTextContent( 17 "current set number: 0" 18 ); 19 }); 20 // it("setCurrentNum", () => { 21 22 // }); 23}); 24
Input.tsx
tsx
1import React, { useState } from "react"; 2 3type InputProps = { 4 currentNum: number; 5 setCurrentNum: React.Dispatch<React.SetStateAction<number>>; 6}; 7const Input: React.FC<InputProps> = ({ currentNum, setCurrentNum }) => { 8 const [inputNumber, setInputNumber] = useState(0); 9 10 return ( 11 <> 12 <input 13 type="number" 14 onChange={(e: React.ChangeEvent<HTMLInputElement>) => { 15 setInputNumber(Number(e.target.value)); 16 }} 17 /> 18 <button onClick={() => setCurrentNum(inputNumber)}>set number</button> 19 <p data-testid="current-num">current set number: {currentNum}</p> 20 </> 21 ); 22}; 23 24export default Input; 25
試したこと
tsx
1const props = { 2 currentNum: 0, 3 setCurrentNum: useState()[1] 4}
と書いてみたものの、
Invalid hook call. Hooks can only be called inside of the body of a function component. This ...
関数のトップレベルで使用しなければならないhooksのルールにより、上記のエラーが表示されます。
調べたこと
「testing-library setState props」で検索したところ、下記のページを見つけました。
How to setState in react-testing-library - Stack Overflow
Google翻訳によって翻訳したものの意味がよく分からなかったのですが、「テストでsetStateを使用するのはやめたほうがよい」と読み取りました。
とはいえsetStateをテストで使用せずとも、propsでsetStateを設定しないと、エラーが解決できない状況です。
今日初めてテストを書き始めたので、頓珍漢なコードを書いている可能性が大いにありますが、ご教示いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー