🧚

Jest を実装する上で便利な eslint-plugin-jest

2024/05/23に公開

はじめに

eslint-plugin-jest は、Jest のテストコードに対する Lint プラグインです。
eslint-plugin-jest を導入することで、Jest のテストコードに対しても静的解析を行うことが可能になります。

https://github.com/jest-community/eslint-plugin-jest

ただ、どれを利用すればいいのかがいまいちわからなかったので、実際にドキュメントを見て、便利そうなプラグインをピックアップしてみました。

個人的に「これ便利だな」「あったら便利かも」と感じた設定をまとめているだけなので、もし「これも便利ですよ!」といったご意見がありましたら、ぜひコメントいただけたらと思います! 🙇

インストール方法

まずは、eslint-plugin-jest をインストールします。

npm install --save-dev eslint-plugin-jest

インストール後は、.eslintrc.json に以下の設定を追加します。

{
  ...
  "env": {
    "jest/globals": true,
  },
  "extends": [
    "plugin:jest/recommended",
    "plugin:jest/style"
  ],
  "plugins": ["jest"],
  "overrides": [
    {
      "files": ["./src/**/*.test.ts", "./src/**/*.test.tsx"],
      "plugins": ["jest"],
      "extends": ["plugin:jest/recommended", "plugin:jest/style"],
      "rules": {
        "jest/consistent-test-it": [
          "error",
          {
            "fn": "test"
          }
        ],
        "jest/no-test-return-statement": "error",
        "jest/prefer-comparison-matcher": "error",
        "jest/prefer-equality-matcher": "error",
        "jest/prefer-expect-resolves": "error",
        "jest/prefer-hooks-in-order": "error",
        "jest/prefer-hooks-on-top": "error",
        "jest/prefer-lowercase-title": "error",
        "jest/prefer-to-have-length": "error",
        "jest/require-top-level-describe": "error"
      }
    },
  ],
  ...
}

各機能の説明

基本的には plugin:jest/recommended を指定することで、デフォルトのオススメ機能が適応されますが、追加で様々なルールを設定していきます。

consistent-test-it

内容

testit をどちらかに統一するルール。
Jest 内では test でも it でも同様の意味を持つが、双方とも利用されると可読性が悪いため 片方に統一した方が良いかも。

悪い例

it("foo");
it.only("foo");

良い例

test("foo");
test.only("foo");

no-test-return-statement

内容

void 以外の返り値を許容しないようにするルール。
Promise を返す必要があるのであれば、async/await を利用する必要がある。

悪い例

test("return an expect", () => {
  return expect(1).toBe(1);
});

test("returning a promise", function () {
  return new Promise((res) => setTimeout(res, 100)).then(() =>
    expect(1).toBe(1)
  );
});

良い例

test("one", () => {
  expect(1).toBe(1);
});

test("one", function () {
  expect(1).toBe(1);
});

test("returning a promise", async () => {
  await new Promise((res) => setTimeout(res, 100));
  expect(1).toBe(1);
});

prefer-comparison-matcher

内容

expect の中で値の比較を行うのではなく、.toBeGreaterThan().oBeLessThanOrEqual() などで比較するように指定するルール。

悪い例

expect(x > 5).toBe(true);
expect(x < 7).not.toEqual(true);
expect(x <= y).toStrictEqual(true);

良い例

expect(x).toBeGreaterThan(5);
expect(x).not.toBeLessThanOrEqual(7);
expect(x).toBeLessThanOrEqual(y);

prefer-equality-matcher

内容

イコールのマッチをした場合、 toBe, toEqual, toStrictEqual 内で期待される値を true としないようにするルール。

悪い例

expect(x === 5).toBe(true);
expect(name === "Carl").not.toEqual(true);
expect(myObj !== thatObj).toStrictEqual(true);

良い例

expect(x).toBe(5);
expect(name).not.toEqual("Carl");
expect(myObj).toStrictEqual(thatObj);

prefer-expect-resolves

内容

expect の内側に await の利用を許容しないルール。

悪い例

test("passes", async () => {
  expect(await someValue()).toBe(true);
});

test("is true", async () => {
  const myPromise = Promise.resolve(true);

  expect(await myPromise).toBe(true);
});

良い例

test("passes", async () => {
  await expect(someValue()).resolves.toBe(true);
});

test("is true", async () => {
  const myPromise = Promise.resolve(true);

  await expect(myPromise).resolves.toBe(true);
});

prefer-hooks-in-order

内容

hooks の順番を

  1. beforeAll
  2. beforeEach
  3. afterEach
  4. afterAll

以外で許容しないルール。

悪い例

describe("foo", () => {
  beforeEach(() => {
    hoge();
  });

  beforeAll(() => {
    fuga();
  });

  test("test-description", () => {
    // ...
  });
});

良い例

describe("foo", () => {
  beforeAll(() => {
    hoge();
  });

  beforeEach(() => {
    fuga();
  });

  test("test-description", () => {
    // ...
  });
});

prefer-hooks-on-top

内容

  • beforeAll
  • beforeEach
  • AfterEach
  • AfterAll

を各テストの前に定義するよう指定するルール。

悪い例

describe("foo", () => {
  beforeAll(() => {
    hoge();
  });

  test("test-description", () => {
    // ...
  });

  beforeEach(() => {
    fuga();
  });
});

良い例

describe("foo", () => {
  beforeEach(() => {
    hoge();
  });

  beforeAll(() => {
    fuga();
  });

  test("test-description", () => {
    // ...
  });
});

prefer-lowercase-title

内容

test, describe の記述は lowercase 以外を許容しないルール。

悪い例

test("Adds 1 + 2 to equal 3", () => {
  expect(sum(1, 2)).toBe(3);
});

良い例

test("adds 1 + 2 to equal 3", () => {
  expect(sum(1, 2)).toBe(3);
});

prefer-to-have-length

内容

length の比較などのテストを行う際は .toBe(), .toEqual(), .toStrictEqual() を利用せず、.toHaveLength() を利用するように指定するルール。

悪い例

expect(files.length).toBe(1);
expect(files.length).toEqual(1);
expect(files.length).toStrictEqual(1);

良い例

expect(files).toHaveLength(1);

require-top-level-describe

内容

一番上は必ず describe を利用するようにルール化。

悪い例

test("my test", () => {});
describe("test suite", () => {
  test("test", () => {});
});

良い例

describe("test suite", () => {
  test("my test", () => {});
  test("test", () => {});
});

Discussion