The "design up front" in TDD is hidden in the write code / refactor steps. The pure TDD framework is bogo-sort for code: start with no code, bang randomly on keyboard, test if it passes, if not then repeat. Obviously something sensible has to go in that gap.
What it usefully replaces is bikeshedding. It lets you try out the design you have in your head, in bite size pieces.