Test-Driven Development (TDD) is supposed to be about feedback, but a recent criticism has been that it tends to cause 'test-induced damage', because the design resulting from TDD is worse than an alternative design one could produce without kowtowing to testability.
The counter-argument is that this may indicate a failure in API design, rather than a failure on the part of the TDD process.
Often, the problem with TDD is an over-reliance on Mocks, which again causes an over-emphasis on mutation. Functional Programming, with its emphasis on immutability, can help significantly pull the tests away from relying on Mocks, leading to a better overall design, and more maintainable unit tests.
This session uses F# to demonstrate how to use Functional design with TDD to remove the need for Mock objects.