🐙

[Jest]単体テストの実装例

2024/07/25に公開

はじめに

Jestの単体テストの学びを整理した記事です。
いくつかの記事に分けて投稿します。

この記事のゴール

単体テストの基本的なテストメソッドを理解できる。

単体テストの実装例

index.ts


export const authUser = (userName: string) => {
  if (userName === "admin") {
    return true;
  }
  return false;
} 

index.test.ts

import { authUser } from ".";

describe("ユーザー認証", () => {
  const store = {
    users: [""],
  };

  beforeEach(() => {
    console.log("beforeEach");
    store.users.push("admin");
    console.log(store.users);
  });

  afterEach(() => {
    console.log("afterEach");
    store.users.pop();
    console.log(store.users);
  });

  describe("ユーザー登録", () => {
    it("正しくユーザーが登録される", () => {
      expect(authUser(store.users[1])).toBeTruthy();
    });

    it("ユーザーが登録されていない", () => {
      expect(authUser(store.users[0])).toBeFalsy();
    });
  });
});

上記のテストに利用しているメソッド一覧

  • describe
  • it
  • expect
  • toBeTruthy
  • toBeFalsy
  • beforeEach
  • afterEach

describe(name, fn)

describe(name, fn) は、いくつかの関連するテストをまとめたブロックを作成する。

const myBeverage = {
  delicious: true,
  sour: false,
};

describe('my beverage', () => {
  test('is delicious', () => {
    expect(myBeverage.delicious).toBeTruthy();
  });

  test('is not sour', () => {
    expect(myBeverage.sour).toBeFalsy();
  });
});

it

第1引数にテスト名を、第2引数にテストの確認項目を含む関数を設定する。
3番目の引数 は タイムアウト値 (ミリ秒単位) で、中止するまでの待ち時間を指定する。

  test('has lemon in it', () => {
    return fetchBeverageList().then(list => {
      expect(list).toContain('lemon');
    });
  });

expect

テストを作成する時に、利用する条件文。
expectによって様々な事柄を検証することができる。

toBeTruthy

期待値が真であるかテストをする。

drinkSomeLaCroix();
if (thirstInfo()) {
  drinkMoreLaCroix();
}
it('drinking La Croix leads to having thirst info', () => {
  drinkSomeLaCroix();
  expect(thirstInfo()).toBeTruthy();
});

toBeFalsy

期待値が偽であるかテストをする。

drinkSomeLaCroix();
if (!getErrors()) {
  drinkMoreLaCroix();
}
it('drinking La Croix does not lead to errors', () => {
  drinkSomeLaCroix();
  expect(getErrors()).toBeFalsy();
});

beforeEach

このファイル内の各テストが完了する前に、関数を実行する。
timeout (ミリ秒) を指定して、中断前にどのくらい待機するかを指定することができる。

const globalDatabase = makeGlobalDatabase();

beforeEach(() => {
  // データベースをクリアし、テストデータを追加します。
  // Jest will wait for this promise to resolve before running tests.
  return globalDatabase.clear().then(() => {
    return globalDatabase.insert({testData: 'foo'});
  });
});

test('can find things', () => {
  return globalDatabase.find('thing', {}, results => {
    expect(results.length).toBeGreaterThan(0);
  });
});

test('can insert a thing', () => {
  return globalDatabase.insert('thing', makeThing(), response => {
    expect(response.success).toBeTruthy();
  });
});

afterEach

このファイル内の各テストが完了するたびに、関数を実行する。
timeout (ミリ秒) を指定して、中断前にどのくらい待機するかを指定することができる。

const globalDatabase = makeGlobalDatabase();

function cleanUpDatabase(db) {
  db.cleanUp();
}

afterEach(() => {
  cleanUpDatabase(globalDatabase);
});

it('can find things', () => {
  return globalDatabase.find('thing', {}, results => {
    expect(results.length).toBeGreaterThan(0);
  });
});

it('can insert a thing', () => {
  return globalDatabase.insert('thing', makeThing(), response => {
    expect(response.success).toBeTruthy();
  });
});

参考記事

Jestの公式APIドキュメント
フロントエンド開発のためのテスト入門 今からでも知っておきたい自動テスト戦略の必須知識

GitHubで編集を提案

Discussion