On this page
Writing tests
You can write tests for your Fresh project by creating an application handler
through
createHandler().
1. Create your routes
routes/index.tsx
import { Handlers } from "$fresh/server.ts";
export const handler: Handlers = {
async POST(req) {
const form = await req.formData();
// Processing something
return new Response(null, {
status: 303,
headers: { location: "/" },
});
},
};
export default function HomePage() {
return <div>Hello Deno!</div>;
}
routes/foo.tsx
export default function FooPage() {
return <div>Hello Foo!</div>;
}2. Write your tests
tests/main_test.ts
import { createHandler, ServeHandlerInfo } from "$fresh/server.ts";
import manifest from "../fresh.gen.ts";
import config from "../fresh.config.ts";
import { assert, assertEquals } from "$std/testing/asserts.ts";
const CONN_INFO: ServeHandlerInfo = {
remoteAddr: { hostname: "127.0.0.1", port: 53496, transport: "tcp" },
};
Deno.test("HTTP assert test.", async (t) => {
const handler = await createHandler(manifest, config);
await t.step("#1 GET /", async () => {
const resp = await handler(new Request("http://127.0.0.1/"), CONN_INFO);
assertEquals(resp.status, 200);
});
await t.step("#2 POST /", async () => {
const formData = new FormData();
formData.append("text", "Deno!");
const req = new Request("http://127.0.0.1/", {
method: "POST",
body: formData,
});
const resp = await handler(req, CONN_INFO);
assertEquals(resp.status, 303);
});
await t.step("#3 GET /foo", async () => {
const resp = await handler(new Request("http://127.0.0.1/foo"), CONN_INFO);
const text = await resp.text();
assert(text.includes("<div>Hello Foo!</div>"));
});
});3. Run the tests
Terminal
$ deno test --allow-read --allow-env --allow-net
running 1 test from ./tests/main_test.ts
HTTP assert test. ...
#1 GET / ... ok (31ms)
#2 POST / ... ok (35ms)
#3 GET /foo ... ok (12ms)
HTTP assert test. ... ok (118ms)
ok | 1 passed (3 steps) | 0 failed (236ms)createHandler in detail
This function is typed as follows:
export async function createHandler(
manifest: Manifest,
config: FreshConfig = {},
): Promise<
(req: Request, connInfo?: ServeHandlerInfo) => Promise<Response>When you’re using it, you’ll likely be importing the manifest from your project.
You can of course import the config (fresh.config.ts) as well, but you’re also
free to provide your own bag of options.
FreshConfig is declared
as follows:
export interface FreshConfig {
build?: {
outDir?: string;
target?: string | string[];
};
render?: RenderFunction;
plugins?: Plugin[];
staticDir?: string;
router?: RouterOptions;
server?: Partial<Deno.ServeTlsOptions>;
}For more on how these work, see the page about server configuration.