jest + React Testing Libraryでテストを行なってみよう!

FRONT END

みなさんこんにちは!
lismotechの大石です。
今回のブログでは、テストフレームワークであるjestとReact Testing Libraryを使用してコンポーネントのテストを行なっていきます。

jestとは?

javaScriptのテストフレームワークで、テストを行うもの。
フロントエンドのReactやVueだけでなく、Node.jsのテストも行うことができます。
React Testing Libraryと連携することでReactのコンポーネントのテストやユーザーが行う動作をシミュレーションすることが出来ます。

Jestを実際に使ってみよう!

今回はReactのコンポーネントに対して実際にjestでテストを行なっていきます。
jest、React Testing Libraryのインストール方法は公式から確認してください。

基本となる関数の説明

  • descrive: テストのグループを作成するために使用される。descrive内にテストケースを記述していきます。
  • test: テストケースを定義し、テストケース内で期待される結果を検証するexpectを使用します。 
  • expect: 期待される結果と実際の結果を比較し、テストの成功と失敗を判定します。
  • render: Reactコンポーネントを仮想DOMにレンダリングし、テスト用のDOMを取得します。
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サイト制作やグラフィックデザイン制作のクリエイティブに関するご相談やご質問、お見積りなどお気軽にお問い合わせください。

お得な情報がLINEに届く!!

LINE公式アカウントはこちらから。

友だち追加

最新記事

CONTACT

NEXTGATE LiSMOtechでは中小企業を中心にブランディング・WEBマーケティングを活用したWEB戦略を提供しています。
企業課題・問題に関するご相談、WEBサイト制作やグラフィックデザイン制作のクリエイティブに関するご相談やご質問、お見積りなどお気軽にお問い合わせください。

平日10:00〜19:00

お電話の場合こちらから

043-305-4162

平日10:00〜19:00