Interesting question. I'll try to give you a good overview from a testers point of view.
If I get a build I'd be expecting the code to be tested at a unit test level to check some of the basics. This means that when I enter some basic boundary value checks it doesn't fall over. For example: If a field accepts 0-100 then it should gracefully handle 101 and -1.
That's a simple example. I think when people say you shouln't test your own code they are refering to the traditional testing phase normally done by trained testers. That doesn't mean it shouldn't be tested at a unit level though. I also advocate testing it manually also, even just to check that it performs the basics.
When I code I write unit tests, integration tests (if possible) and definately manually test it for basics. The problem though is that testing code I've written is never as effective as someone else testing it. I have assumptions and ideas about the code that might mean I skip or ignore bits. I may assume too much. Take too much for granted. Think I know what the code does. A pro tester will avoid these assumptions and hence often find defects you may not find.
A good tester will also check edge cases, usability and whole host of interesting areas.
There was one comment left here that the specs might be vague and hence tricky to write tests from. But as a tester I would also suggest that doesn't that make coding it tricky too?
In my experience it is well worth pairing a dev and tester together to write unit tests. It's an amazing sight and the breadth of coverage is often excellent.
Cheers
Rob..