Skip to content
Sarj Code Standards

no-bare-return-from-test-catch

Disallow a bare return from a test catch block when it skips a later assertion.

Why

An unasserted catch return can swallow a failure and skip later assertions; the complete test result also depends on other assertions and hooks.

Fix

Rethrow the error, assert on it, or use the runner's explicit skip mechanism when the capability is optional.

Examples

Before — flagged Do not silently pass
src/codec.test.ts
test("decodes", () => {
try {
decode();
} catch {
return;
}
expect(result()).toBe("ok");
});
After — preferred Preserve the failure
src/codec.test.ts
test("decodes", () => {
try {
decode();
} catch (error) {
throw error;
}
expect(result()).toBe("ok");
});
Before — flagged Case tables must preserve failures
src/codec.test.ts
test.each(["valid", "invalid"])("decodes %s", (input) => {
try {
decode(input);
} catch {
return;
}
expect(result()).toBe("ok");
});
After — preferred Each table case propagates its failure
src/codec.test.ts
test.each(["valid", "invalid"])("decodes %s", (input) => {
try {
decode(input);
} catch (error) {
throw error;
}
expect(result()).toBe("ok");
});
Before — flagged A false skip condition does not preserve the failure
src/codec.test.ts
import { test, expect } from "vitest";
test.for(["optional"])("decodes %s", (input, context) => {
try {
decode(input);
} catch {
context.skip(false);
return;
}
expect(result()).toBe("ok");
});
After — preferred A Vitest context skip preserves an optional table case
src/codec.test.ts
import { test, expect } from "vitest";
test.for(["optional"])("decodes %s", (input, context) => {
try {
decode(input);
} catch {
context.skip("codec unavailable");
return;
}
expect(result()).toBe("ok");
});

Files

**/*.test.***/*.spec.***/tests/****/__tests__/**