Skip to main content
← ⚑ JavaScript & the browserΒ·Module C8 Β· Lesson 7
TaskMake runAll async-aware (await fn()). Write test('resolves to 42', async () => { const v = await Promise.resolve(42); assert(v === 42) }) and test('rejects fails', async () => { await Promise.reject(new Error('boom')) }). Call await runAll(). Expect 1 pass + 1 fail.

Testing async code

125 XP9 min
Theory

Async tests need an async runner

Update the test runner to await the body. Tests can now be async functions and use await inside.

async function runAll() {
  for (const { name, fn } of tests) {
    try {
      await fn();
      console.log("PASS " + name);
    } catch (err) {
      console.log("FAIL " + name + " β€” " + err.message);
    }
  }
}

Now you can:

test("fetches user", async () => {
  const user = await loadUser(1);
  assertEqual(user.name, "Anna", "user name");
});

Forgetting await is the #1 async test bug

If you write test("x", () => { somePromise() }) without awaiting somePromise, the runner sees the test "pass" because the function returned without throwing. The Promise's rejection happens AFTER. Always await async work in tests.

πŸ”’

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial β€” card required, cancel anytime.

Sign up β€” free trial β†’

First 10 lessons in each track are free. No card needed for those.

← PreviousNext lesson β†’

Get one Python or web tip a day β€” by email

Short, hand-written, no spam. Unsubscribe in one click.