Tests (factories + client de route)
defineFactory génère des données de test typées et séquencées ; testRoute(module) appelle le loader/action d'une route avec une requête synthétisée pour vérifier le résultat — sans serveur ni DOM. Les assertions ci-dessous s'exécutent en direct, avec les mêmes helpers qu'en bun test.
Astuce
Pour le test de composants (rendu + requêtes + interactions dans un DOM happy-dom), utilisez @bext-stack/framework/testing. testkit est pur (aucune dépendance DOM) et cible la logique applicative : données via factories, routes via testRoute.
Données générées par la factory
| u0 | user0@acme.co | admin |
| u1 | user1@acme.co | member |
| u2 | user2@acme.co | admin |
Assertions en direct
✓rejects an invalid signup (bad email + underage)réussi
✓accepts a valid signup and coerces age to a numberréussi
✓factory make() applies overrides (role = admin)réussi
import { defineFactory, cycle, testRoute } from "@bext-stack/framework/testkit";
import * as signup from "../app/signup/page"; // your route module
const userFactory = defineFactory((n) => ({
id: `u${n}`, email: `user${n}@example.com`, role: cycle("admin", "member")(n),
}));
test("rejects an invalid signup", async () => {
const route = testRoute(signup);
const res = await route.post({ email: "nope", age: "12" }); // calls the action
expect(res.ok).toBe(false);
});
test("loader reads query params", async () => {
expect(await testRoute(signup).get({ ref: "promo" })).toMatchObject({ ref: "promo" });
});