We've been trying to hire a part-time contract dev recently and we hate the process so we've been a little half-assed about it.
As a result I think we've stumbled across a fairly effective approach.
We ask them to do a half day to day coding task based on a real requirement. We pay them for this as we have few enough applicants that we want to test that we can afford to.
We give them the requirement as if it came directly from the client. It's incomplete and there's a few assumptions they might make that would be incorrect.
It's fascinating to watch how people have approached this. We've only done two so far but the degree to which they ask the right questions vs leap in and try and code their way through it is revealing a lot.
Our initial setup instructions had a couple of errors in and this too has been really useful. Watching how they respond and how they resolve the problem.
It's remarkably close to real world tasks - poorly worded requirements, problems with documentation, missed assumptions that it feels like we're testing the things we really want to test.
The difficulty is that we can't come right out and tell them this is what we're doing and the artificial nature of the test might make them less likely to ask questions that they would ask in a live task. We've tried to drop hints to guide them into doing so however.