🍣

テストコードまとめたい!jestでファイル分割をする方法(unit)

2024/09/02に公開

今回は、jest でファイル分割をしてテストを行う方法についてまとめました!

プロジェクト全体のテストを一つのファイルにまとめるとコードが膨大な量になってしまい、見づらいコードが出来上がってしまいます。

そうならないためにも、ファイルを分割してコードを見やすくしておきたいですね!

ディレクトリ構成

├── server.unit.test.js
└── tests
      ├── ideas.test.js
      ├── users.test.js
      └── words.test.js

server.unit.test.js : 全体で実行するテストコード

tests/... : 個々に分割したテストコード

ソースコード

全体で実行するテストに、個々で書いたテストコードをインポートしていきます。

こちらの例では、テストの実行前に mongodb に接続(beforeAll)、実行後に接続を解除しています(afterAll)

/**
 * @jest-environment jsdom
 */

const {TextEncoder, TextDecoder} = require('util');
global.TextEncoder = TextEncoder;
global.TextDecoder = TextDecoder;

const { connectMongo, disconnectMongo } = require("./services/mongo");

const ideasTest = require("./tests/ideas.test");
const usersTest = require("./tests/users.test");
const wordsTest = require("./tests/words.test");

jest.setTimeout(14000);

describe("Test server API", () => {

  beforeAll(async () => {
    await connectMongo();
  });

  afterAll(async () => {
    await disconnectMongo();
  });

  describe("Test Users API", usersTest);

  describe("Test Words API", wordsTest);

  describe("Test Ideas API", ideasTest);
});

以下は個々のテストコードです。

/**
 * @jest-environment jsdom
 */
const request = require("supertest");
const app = require("../app");

const ideasTest = () => {
  describe("Test GET /idea", () => {
    test("It should response with 200 success", async () => {
      const response = await request(app)
        ...
    });
  });

  describe("Test POST /idea", () => {
    const completeIdeaData = {
      idea: "テスト + アイデア",
      desc: "詳細味入力(テスト)",
    };
    test("It should response with 201 success", async () => {
      const response = await request(app)
        ...
    });

    test("It should catch Missing required properties", async () => {
      const response = await request(app)
        ...
    });
  });
};

module.exports = ideasTest;

/**
 * @jest-environment jsdom
 */
const request = require("supertest");
const app = require("../app");
const wordsTest = () => {
  describe("Test GET /word", () => {
    test("It should respond with 200 success", async () => {
      const response = await request(app)
        ...
    });
  });

  describe("Test POST /word", () => {
    const completeWordData = {
      word: "テスト用単語",
    };

    test("It should respond with 201 success", async () => {
      const response = await request(app)
        ...
    });

    test("It should catch Missing required properties", async () => {
      const response = await request(app)
        ...
    });
  });
};

module.exports = wordsTest;
/**
 * @jest-environment jsdom
 */
const request = require("supertest");
const app = require("../app");

const ideasTest = () => {
  describe("Test GET /idea", () => {
    test("It should response with 200 success", async () => {
      const response = await request(app)
        ...
    });
  });

  describe("Test POST /idea", () => {
    const completeIdeaData = {
      idea: "テスト + アイデア",
      desc: "詳細味入力(テスト)",
    };
    test("It should response with 201 success", async () => {
      const response = await request(app)
        ...
    });

    test("It should catch Missing required properties", async () => {
      const response = await request(app)
        ...
    });
  });
};

module.exports = ideasTest;

テストの実行方法

コマンドでシンプルに jest を実行すると全体のテスト、個々のテストが全て実行されてしまいます。

では、server.unit.test.js のみを実行するのにはどうすればよいのでしょうか?

答えはシンプル。

jest unit

と入力すれば OK!

Discussion