Skip to content
← Back to rules

jest/no-conditional-expect 正确性

它的作用

此规则禁止在条件块(如 if 语句和 catch 块)中使用 expect,包括在名为 catch 的函数回调中使用 expect,这些函数被假定为处理 Promise。

为什么这是个问题?

Jest 只有在抛出错误时才认为测试失败,这意味着如果断言函数(如 expect)调用出现在条件代码中(例如 catch 语句),测试可能会看似通过但实际上并未真正测试任何内容。此外,条件逻辑会使测试变得更加脆弱且复杂,因为需要更多的思维来理解实际被测试的内容。

示例

以下为该规则的 错误 代码示例:

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

参考资料