Traditional TDD dicates that you write code like this:
- Write the smallest test possible that fails
- Write code to make the test pass
- Refactor while the test still passes
- Repeat
In practice, the TDD process doesn't always work out. You might waste too much time writing tests that don't actually matter. You might spend too much time mocking data. You might not actually know what test to write.