みなさんこんにちは!
lismotechの大石です。
今回のブログでは、テストフレームワークであるjestとReact Testing Libraryを使用してコンポーネントのテストを行なっていきます。
javaScriptのテストフレームワークで、テストを行うもの。
フロントエンドのReactやVueだけでなく、Node.jsのテストも行うことができます。
React Testing Libraryと連携することでReactのコンポーネントのテストやユーザーが行う動作をシミュレーションすることが出来ます。
今回はReactのコンポーネントに対して実際にjestでテストを行なっていきます。
jest、React Testing Libraryのインストール方法は公式から確認してください。
基本となる関数の説明
import { render,screen, waitFor } from "@testing-library/react"
// loginコンポーネントimport
import Login, { validateEmail } from "../Login"
import userEvent from "@testing-library/user-event";
describe("ログインコンポーネントをテストします", () => {
test("ボタンが1つあるかどうか", async () => {
// loginコンポーネントをレンダリング
render(<Login />);
// findAllByRole関数で何の要素をテストするのか指定
const buttonList = await screen.findAllByRole('button');
// toHaveLengthで数をテストする
expect(buttonList).toHaveLength(1);
});
});
上記コードのようにテストしたいコンポーネントファイルをimportします。
renderでLoginコンポーネントをレンダリングし、screenで要素の取得、expectに結果を記述してテストを行います。
この場合はLoginコンポーネント内に<button>要素がいくつあるのかを確認しています。
フォームはreact-bootstrapで作成、メールアドレスの形式が違っていた場合のバリデーションのチェックを行なってみました。
Login.js
import React, { useState } from "react";
import { Form, Button, Alert } from "react-bootstrap";
const Login = () => {
const [email, setEmail] = useState("");
const [error, setError] = useState("");
const [showUser, setShowUser] = useState(false);
const handleSubmit = (e) => {
setShowUser(false);
e.preventDefault();
if (validateEmail(email)) {
setShowUser(true);
setError("");
return;
}
setError("メールアドレスが有効ではありません");
};
return (
<>
<Form onSubmit={handleSubmit} noValidate>
<Form.Group className="mb-3" controlId="formBasicEmail">
<Form.Label>メールアドレス</Form.Label>
<Form.Control
type="email"
placeholder="メールアドレス入力"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</Form.Group>
{showUser && (
<Alert data-testid="user" variant="success">
{email}
</Alert>
)}
{error && (
<Alert data-testid="error" variant="danger">
{error}
</Alert>
)}
<Button data-testid="submit" variant="primary" type="submit">
送信
</Button>
</Form>
</>
);
};
export const validateEmail = (email) => {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/i;
if (regex.test(email)) {
return true;
}
return false;
};
export default Login;
Login.test.js
import { render,screen, waitFor } from "@testing-library/react"
import Login, { validateEmail } from "../Login"
import userEvent from "@testing-library/user-event";
describe("ログインコンポーネントをテストします", () => {
test("ボタンが1つあるかどうか", async () => {
render(<Login />);
// findAllByRole関数で何の要素をテストするのか指定
const buttonList = await screen.findAllByRole('button');
// console.log(buttonList);
// toHaveLengthで数をテストする
expect(buttonList).toHaveLength(1);
});
test("メールアドレスのバリデーションが失敗すること", () => {
const testEmail = "masa.com";
expect(validateEmail(testEmail)).not.toBe(true);
});
test("メールアドレスのバリデーションが成功すること", () => {
const testEmail = "oishi@gmail.com";
expect(validateEmail(testEmail)).toBe(true);
});
test("メールアドレスを送信できるのかどうか", async () => {
render(<Login />);
const submitButton = screen.getByTestId("submit");
console.log(submitButton);
const email = screen.getByPlaceholderText("メールアドレス入力");
// emailにoishi@gmail.comを入力
userEvent.type(email, "oishi@gmail.com");
userEvent.click(submitButton);
await waitFor(() => {
const userInfo = screen.getByText("oishi@gmail.com");
expect(userInfo).toBeInTheDocument();
});
});
});
ボタンの数、メールのバリデーションの確認、ボタンクリック時のテキスト表示確認を行なってみました。
簡単なコンポーネントからテストケースを作成し、テストしてみるといいと思います!
是非やってみてください!
今回はJestとReact Testing Libraryを使用したテストを行なってみました!
最初は難しそうに感じると思いますが、実際のテストを行なってみると基礎の部分は簡単にできると思います。
モックやスパイを使用すると複雑になっていきます、モックやスパイについても次回書きたいと思います。
それでは、次回のブログもお楽しみに!
NEXTGATE LiSMOtechでは中小企業を中心にブランディング・WEBマーケティングを活用したWEB戦略を提供しています。
企業課題・問題に関するご相談、WEBサイト制作やグラフィックデザイン制作のクリエイティブに関するご相談やご質問、お見積りなどお気軽にお問い合わせください。
平日10:00〜19:00
© NEXTGATE LiSMOtech All rights reserved