I've been trying to get into TDD but am hitting some stumbling blocks. I suppose a simplified example would be the best way to explain. My first assumption is that I start from the top. I want a web page that displays a list of categories say. So I write a test for a CategoryController whose Index action should return this list:-

Code:
[TEST]
public void IndexActionShouldReturnListOfCategories()    {
    var catController = new CategoryController();
    var result = catController.Index() as ViewResult;
    Assert.IsInstanceOf(typeof(List<Category>), result.ViewDate.Model);
}
Now in true TDD fashion we get errors. No CategoryController exists so we create it:-

Code:
    public class CategoryController : Controller {
        public ActionResult Index() {
            return View();
        }
    }
Running our test will result in a fail because the view will not have a list of categories so refactor:-

Code:
    public class CategoryController : Controller {
        public ActionResult Index() {
            var catList = new List<Category>();
            return View(catList);
        }
    }
Bingo our test will pass. Now my problem here is how does TDD drive us beyond this point? Our tests have passed and it fulfills out requirements but of course we know that a fully working app would need say an ICategoryService to be passed into the Controller and the controller would use this to retrieve the categories. Now I can and will skip TDD and write in this service but I'm wracking my brains at how TDD can force us into this on it's own which is preferable I think because if TDD drives us our code will probably be optimal.