Jeffrey just published a really good mini-podcast on this topic. Check it out.
I would suggest there are a few important principles to keep in mind when you are testing:
Keep things in perspective. You do testing because you want your software to be reliable. Exactly how you decide to do testing is much less important than the fact that you do have tests.
If you find that a test is getting excessively tedious to write, then maybe you're going about it the wrong way. For example, let's say you are writing tonnes of complicated mocks to avoid touching the database. Maybe you should just write a simple test that touches the database and be done with it.
Do i write a test to see if laravel returns the correct error if, let's say, a user inputs a email that should be unique to the registration form but all other fields are correct? After that, write another test to see if i get the correct error if the email is okay, but for example the password confirmation does not match the password? Do i test registration to see if the user is correctly entered into the database? After that do i test login to see if the user can log in with those details?
I tend to "bundle" my acceptance tests, by testing the failure states first, and then finishing with the success state. So for a login test, I'll check the behaviour for "invalid username", then for "valid username, wrong password", then for a correct login (here I will check that the user is in fact logged in). That's just one way to do it; but regardless, I would recommend testing error states as well as success states.
If i do it like that, i (think) i'm already testing everything in my application, right? I test with this all the forms, all the pages, all the links. Should I (And WHY) do any other testing (Unit testing with PHPSpec)?
Testing "outside in" like that is a really good starting point. It means you've automated the tests that you used to do manually in a web browser. In other words, your QA process has become much less work (and more reliable).
However, unit tests are often beneficial because they are more precise. Imagine that you change something and one of your acceptance tests fails. Okay, the test has proved valuable because it alerted you to the failure. That's great. But now what? How do you find the problem?
If you have a good suite of unit tests too, then they will often show you exactly where the failure is. Unit tests verify the correctness of small bits of code -- typically individual methods. This is "inside out" testing.
Some people also like using unit tests to guide program design. This is more a matter of personal taste, and it also depends on the type of code you're writing. For example, I'm not convinced that "test driven design" is useful when you're doing CRUD work. Anyway, PHPspec encourages this approach. But you can also just use PHPunit to do unit testing.