top of page

My First Full-Stack Project: The Testing Mistake I Made (So You Don’t Have To)

  • Nov 22, 2025
  • 2 min read

Updated: Jan 10

When I started building my first full-stack project, I didn’t follow a Test-Driven Development (TDD) workflow. Like many beginners, I built my backend routes first and told myself I would “write the tests later”.

Later arrived…and brought confusion with it.

When I finally started writing my tests with Jest and Supertest, I made a big beginner mistake: I rewrote my entire route logic inside the test files. Every test suite became almost as long as my route file. My tests were bulky, repetitive, and honestly exhausting. I was doing double work instead of simply testing behaviour.

To help other beginners avoid this mistake, I want to share the method that finally made everything click for me:


How to Structure Your Express Backend for Easy Testing with Jest and Supertest


Testing your API shouldn’t feel like rebuilding your entire backend inside your test files. The key is simple:

Make your route handlers and validators exportable. This is what allows tests to use the real logic—not a rewritten version of it.

Before we get into best practices, let’s clarify something important…


What Kind of Testing Is This? (Since It’s NOT TDD)


Because I built my backend first and wrote tests afterwards, what I did is called:


  • Test-After Development (TAD)

This means:

  • TDD: tests → then code

  • TAD: code → then tests (what most beginners naturally do)

There’s nothing wrong with this. Many engineers use TAD unless the project specifically requires strict TDD.

And what type of tests was I writing?


  • Integration Tests

When I used Supertest to hit real endpoints, I was doing integration testing — testing the whole request → response cycle.


  • Unit Tests (sometimes)

When I mocked the database and tested just the controller function, that was unit testing.

So the actual breakdown is:

  • Workflow: Test-After Development

  • Test Types: Mostly integration tests + some unit tests


Why Good Structure Matters for Testing

If your route logic is written inline inside the route definition, like this:




…it becomes harder to:

  • test the logic directly

  • mock dependencies

  • avoid duplicating logic in tests

Exporting your handlers solves this.


Best Practices for Test-Friendly Express Architecture


1. Export Route Handlers and Validators

Instead of inline logic, define your handlers separately and export them:



Route definition:



This structure separates concerns, keeps logic modular, and makes controllers reusable both in production and during testing.


2. Use Supertest for Realistic Endpoint Testing

Supertest allows you to simulate real HTTP requests without manually reconstructing logic:




This keeps integration tests clean and focused.


3. Mock Dependencies for Controller Unit Tests

Because handlers are exported, they can also be tested directly:



This is ideal for isolated unit tests.


Conclusion

Building my first full-stack project taught me an important lesson: testing becomes dramatically easier when the backend is structured well.

Exporting route handlers and validators results in:

  • cleaner tests

  • no repeated logic

  • easier mocking

  • better scalability

  • more maintainable code overall

Even without TDD, adopting these structural best practices sets a strong foundation for professional-level backend development and demonstrates an understanding of clean architecture — something valuable for real projects.


3 Comments

Rated 0 out of 5 stars.
No ratings yet

Add a rating
Speckiee
Jan 08
Rated 5 out of 5 stars.

Great post! Your reflection clearly captures a common testing pitfall many developers encounter early on; the mistake of duplicating application logic in tests and tied it back to the real purpose of testing: validating behavior, not re-implementing code.

Like

Shabz1016
Jan 08
Rated 5 out of 5 stars.

Very insightful for someone interested in the software engineering field, please publish more!!

Like

Guest
Jan 08
Rated 5 out of 5 stars.

Thanks for a lovely self reflection

Like
1767848289015_edited.jpg

Hi, thanks for stopping by!

My name is Elizabeth, or simply Elza. To know a few things about me, click on 'Read More'.

Let the posts
come to you.

Thanks for submitting!

  • Facebook
  • Instagram
  • Twitter
  • Pinterest

Let me know what's on your mind

Thanks for submitting!

© 2023 powered by Gut Anders

bottom of page