jest/no-conditional-expect 正しさ
何を実行するか
このルールは、if や catch などの条件ブロック内で expect を使用することを禁止します。 これは、catch と名付けられた関数のコールバック内に expect を使用する場合も含まれます。このような関数は、プロミスであると仮定されています。
なぜ問題なのか
Jest では、テストが失敗したと判断されるのは、エラーがスローされた場合のみです。そのため、catch ステートメントなど条件付きコード内でのアサーション関数(例:expect)の呼び出しは、テストがパスするものの、実際には何も検証されていない状態になり得ます。さらに、条件分岐はテストをより脆弱で複雑なものにしてしまう傾向があり、実際に何を検証しているのかを理解するためにより多くの思考が必要になります。
例
このルールに対して不適切なコードの例:
js
it("foo", () => {
doTest && expect(1).toBe(2);
});
it("bar", () => {
if (!skipTest) {
expect(1).toEqual(2);
}
});
it("baz", async () => {
try {
await foo();
} catch (err) {
expect(err).toMatchObject({ code: "MODULE_NOT_FOUND" });
}
});
it("エラーをスローする", async () => {
await foo().catch((error) => expect(error).toBeInstanceOf(error));
});このルールに対して適切なコードの例:
js
it("foo", () => {
expect(!value).toBe(false);
});
function getValue() {
if (process.env.FAIL) {
return 1;
}
return 2;
}
it("foo", () => {
expect(getValue()).toBe(2);
});
it("リクエストの検証", () => {
try {
processRequest(request);
} catch {
} finally {
expect(validRequest).toHaveBeenCalledWith(request);
}
});
it("エラーをスローする", async () => {
await expect(foo).rejects.toThrow(Error);
});このルールは eslint-plugin-vitest と互換性があります。使用するには、.oxlintrc.json に以下の設定を追加してください:
json
{
"rules": {
"vitest/no-conditional-expect": "error"
}
}使い方
このルールを構成ファイルまたは CLI で有効化するには、以下を使用できます:
json
{
"plugins": ["jest"],
"rules": {
"jest/no-conditional-expect": "error"
}
}bash
oxlint --deny jest/no-conditional-expect --jest-plugin