Essai
bext donne aux applications PRISM les deux ergonomies de test que vous connaissez de Laravel et de la bibliothèque de tests, toutes deux exécutables en clair bun test :
@bext-stack/framework/testkit— Usines modèles pour les données de test ensemencées et un client de test d'itinéraire qui invoque leloader/actiond'un itinéraire avec une requête synthétisée. Pur, pas de DOM, pas de serveur.@bext-stack/framework/testing— Test de composants : rendu d'un Composant"use signals", interrogez-le, interagissez et affirmez (soutenu par happy-dom).
Usines#
import { defineFactory, cycle } from "@bext-stack/framework/testkit";
const userFactory = defineFactory((n) => ({
id: `u${n}`,
email: `user${n}@example.com`, // `n` gives unique fields
role: cycle("admin", "member")(n), // cycle by index
active: true,
}));
const users = userFactory.makeMany(3); // 3 seeded users
const admin = userFactory.make({ role: "admin" }); // one, overridden
const admins = userFactory.state(() => ({ role: "admin" })).makeMany(2); // a variant (states)
make / makeMany avance une séquence afin que les champs uniques restent uniques ;
makeMany(n, i => ({...})) prend des remplacements par index ; state(fn) dérive une usine de variantes (états d'usine Laravel) ; reset() remet à zéro la séquence.
Client de test d'itinéraire#
testRoute(module) encapsule les exportations loader / action d'une route et les appelle avec un Request synthétisé :
import { testRoute } from "@bext-stack/framework/testkit";
import * as signup from "../app/signup/page";
test("rejects an invalid signup", async () => {
const route = testRoute(signup);
const res = await route.post({ email: "nope", age: "12" }); // form-encoded → action
expect(res.ok).toBe(false);
});
test("loader reads query params", async () => {
expect(await testRoute(signup).get({ ref: "promo" })).toMatchObject({ ref: "promo" });
});
| Membre | Appels |
|---|---|
.get(query?) |
le loader avec une demande GET |
.post(fields?) |
le action avec un POST codé par forme |
.postJson(body) |
le action avec un JSON POST |
.request(req) |
soit un gestionnaire avec un Request explicite (en-têtes/cookies personnalisés) |
Générateurs de requêtes autonomes — formData(obj), formRequest(url, fields),
jsonRequest(url, body) — sont également exportés et les usines alimentent directement les entrées d'action : route.post(userFactory.make()).
Tests de composants#
import { render } from "@bext-stack/framework/testing";
const { text, getByTestId, click } = render(Counter, { start: 5 });
expect(text()).toContain("Count: 5");
click(getByTestId("inc"));
expect(text()).toContain("Count: 6");
render SSRs + hydrate le composant dans un conteneur happy-dom et renvoie les requêtes ( getByText, getByTestId, getAllByTag ) et les interactions ( click,
type, fire ). Importez-le uniquement à partir des fichiers de test — il récupère Happy-Dom.
Essayez-le#
Le démo du kit de test en direct génère des données d'usine et exécute les assertions testRoute dans l'isolat — les mêmes assistants que vous utiliseriez dans bun test. Source dans sites/demo/src/app/examples/testkit/page.tsx.
Voir aussi#
- Validation — la logique d'action sur laquelle vous affirmerez.
- Données et migrations — les usines s'associent à l'ORM pour l'ensemencement.
- Boîte à outils de candidature — le reste de la couche d'application TypeScript.