✅ Testing with AVA

We'll now add tests with AVA to our previous esbuild example.

Dependencies

# Install ava as a dev dependency
$ npm install -D ava

Enable ES modules mode, and add a new test script in package.json:

{
  ...,
  "type": "module",
  "scripts": {
    ...
    "test": "npm run build && ava --verbose test/*.spec.js"
  },
  ...
}

Isolated Tests

Create the following file containing our tests:

// test/index.spec.js
import test from "ava";
import { Miniflare } from "miniflare";

test.beforeEach((t) => {
  // Create a new Miniflare environment for each test
  const mf = new Miniflare({
    // We don't want to rebuild our worker for each test, we're already doing
    // it once before we run all tests in package.json, so disable it here.
    // This will override the option in wrangler.toml.
    buildCommand: undefined,
  });
  t.context = { mf };
});

test("increments path count for new paths", async (t) => {
  // Get the Miniflare instance
  const { mf } = t.context;
  // Dispatch a fetch event to our worker
  const res = await mf.dispatchFetch("http://localhost:8787/a");
  // Check the count is "1" as this is the first time we've been to this path
  t.is(await res.text(), "1");
});

You can run the tests with:

$ npm test

Manipulating KV

Let's try set an initial count in KV before we make our request to make sure our worker works with existing counts. Add the following code to test/index.spec.js:

test("increments path count for existing paths", async (t) => {
  // Get the Miniflare instance
  const { mf } = t.context;
  // Get the counter KV namespace
  const ns = await mf.getKVNamespace("COUNTER_NAMESPACE");
  // Set an initial count of 5
  await ns.put("/a", "5");
  // Dispatch a fetch event to our worker
  const res = await mf.dispatchFetch("http://localhost:8787/a");
  // Check returned count is now "6"
  t.is(await res.text(), "6");
  // Check KV count is now "6" too
  t.is(await ns.get("/a"), "6");
});

More Examples

For more examples of testing workers with AVA, Miniflare uses AVA for its own testing.