Allowing someone to do a practical project on their own time doesn't necessarily mean it is them who does it.
Everyone arrives early for an interview (well, should at least). We have a 'while you wait' sheet for them to work on until we are ready to see them. It has eight (8) questions that test an applicants knowledge in the language we primarily use.
We are not looking for the answers to all be right, as anyone can get them right with a computer in front of them. We are looking for process, do they even attempt the question, how do they come to their answers.
When we come into the interview we go over it with them and answer any questions they may have which can also lead them to getting the correct answer. It also allows us to ask how they got the answers they came up with.
This combined with previous work, we find, are the best ways to filter out candidates.
We have significantly changed our process in how we hire developers.
Phase 1: A 15 minute phone interview where we ask 7 questions. The first 2 are "What is the most fun thing you've worked on?" (doesn't have to be programming related) and "What do you code for fun in your free time?".
Phase 2: A mini project that they complete on their own time. We then do a screen share with them and they show us what they have built. During the screen share we also get them to make two changes to their project and then watch them work through it and get it working.
Phase 3: In person interview.
This process allows us to figure out culture fit right away (phase 1). If they can do the work and actually walk their talk (phase 2). Finally, ensure their values are inline with what we are looking for (phase 3).