DEV Community

Cover image for Testing Your API with Fastify and Vitest: A Step-by-Step Guide
Roberto Umbelino
Roberto Umbelino

Posted on

Testing Your API with Fastify and Vitest: A Step-by-Step Guide

Hey there! Let's dive into how to test an API built with Fastify using Vitest and TypeScript. We'll focus on a simple health check route and make sure everything's working as it should.

Why Test an API?

Testing an API is super important to make sure everything is running smoothly. Automated tests help us catch bugs quickly and keep our code solid and reliable.

Setting Up the Environment

Let's start from scratch and set up our project. First, create a directory for the project and initialize a new Node.js project:

mkdir my-fastify-api
cd my-fastify-api
npm init -y
Enter fullscreen mode Exit fullscreen mode

Next, let's install Fastify and TypeScript:

npm install fastify
npm install typescript ts-node @types/node --save-dev
Enter fullscreen mode Exit fullscreen mode

Create a tsconfig.json file to configure TypeScript:

{
  "compilerOptions": {
    "target": "ESNext",
    "module": "CommonJS",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "outDir": "./dist",
    "rootDir": "./src"
  },
  "include": ["src/**/*.ts"]
}
Enter fullscreen mode Exit fullscreen mode

Creating the Fastify Server

Now, let's set up a Fastify server with a simple health check route. Create a src directory and inside it, make an app.ts file:

// src/app.ts
import fastify from 'fastify';

const app = fastify();

app.get('/health-check', async (request, reply) => {
  return { status: 'ok' };
});

export default app;
Enter fullscreen mode Exit fullscreen mode

Next, let's create the server.ts file to start the server:

// src/server.ts
import app from './app';

const start = async () => {
  try {
    await app.listen({ port: 3000 });
    console.log('Server is running on http://localhost:3000');
  } catch (err) {
    app.log.error(err);
    process.exit(1);
  }
};

start();
Enter fullscreen mode Exit fullscreen mode

Installing Vitest

Now, let's install Vitest so we can write our tests:

npm install --save-dev vitest
Enter fullscreen mode Exit fullscreen mode

Add the following scripts to your package.json:

"scripts": {
  "dev": "ts-node src/server.ts",
  "test": "vitest",
  "test:watch": "vitest --watch"
}
Enter fullscreen mode Exit fullscreen mode

Writing Tests

Let's write a test for our health-check route. Create a tests directory and inside it, make a health-check.test.ts file:

// tests/health-check.test.ts
import app from '../src/app';
import { test, expect } from 'vitest';

test('GET /health-check should return status OK', async () => {
  const response = await app.inject({
    method: 'GET',
    url: '/health-check'
  });

  expect(response.statusCode).toBe(200);
  expect(response.json()).toEqual({ status: 'ok' });
});
Enter fullscreen mode Exit fullscreen mode

Running the Tests

To run the tests, use this command:

npm test
Enter fullscreen mode Exit fullscreen mode

If you want the tests to run continuously whenever you make changes, use:

npm run test:watch
Enter fullscreen mode Exit fullscreen mode

Conclusion

And that's it! In this article, we saw how to set up a Fastify project with TypeScript from scratch and how to write tests for a simple route using Vitest. Testing your routes makes sure your API is always working correctly and helps avoid any nasty surprises later on. Happy coding!

Top comments (2)

Collapse
 
henriqueschroeder profile image
Henrique Schroeder

Great post! I’ve never used Fastify, but Vitest turns out to be much superior. The only thing it might lack are some tools that Jest already has, but this isn’t something that would make you stop using Vitest.

Collapse
 
robertoumbelino profile image
Roberto Umbelino

Yeah, Jest has 12 years, and Vitest has 3 years. It’s normal for Jest to have more functionalities than Vitest, but Vitest’s performance is much better.