Negative CRUD Unit Testing in Laravel 5
As part II of the CRUD Unit Testing in Laravel 5, we continue with negative testing.
What we have in the previous article is testing the positive side; say it CAN create, update, show or delete the carousel we are trying to do.
Now let us test the opposite, what if it fails and how we handle it?
Let us start on the CREATE test.
Remember, when we create our migration file,
we set the link as nullable but the title and the src are NOT NULL.
So, we expect here that the database should throw an error when those columns are null right? Good thing we are catching it in our repository class!
Look, in Laravel, the database error is
QueryException so we catch it and create our own more readable error exception
With these things in place, run your
phpunit and see what happens
PHPUnit 6.5.7 by Sebastian Bergmann and contributors.. 1 / 1 (100%)Time: 993 ms, Memory: 26.00MBOK (1 test, 1 assertion)
This means we are catching it correctly.
Later, we can catch this
CreateCarouselErrorException in our controller and respond with our own action when we hit it.
How about when the carousel is not found?
And looking back at our
findCarousel() method in our repository
We are catching the
ModelNotFoundException which is default to Laravel when it can’t find the model. Good!
Now, run phpunit again.
PHPUnit 6.5.7 by Sebastian Bergmann and contributors.. 1 / 1 (100%)Time: 936 ms, Memory: 26.00MBOK (1 test, 1 assertion)
Getting a hold of it? Good.
How about when we cannot update it?
You see, we purposely set the title to
null because in our previous test it will throw an error if this is
null when created. So we assume that the title has a value in the database already.
Note: When expecting for the error, it should always be on top of the method we are trying to test
PHPUnit 6.5.7 by Sebastian Bergmann and contributors.. 1 / 1 (100%)Time: 969 ms, Memory: 26.00MBOK (1 test, 1 assertion)
Next is delete. But we have to modify our return type from
?bool which means it can
Important: You must be running on ≥ php 7.1 to get this feature
Then the test
And the result
➜ git: phpunit --filter=CarouselUnitTest::it_error_when_deleting_a_non_existing_carousel
PHPUnit 6.5.7 by Sebastian Bergmann and contributors.. 1 / 1 (100%)Time: 938 ms, Memory: 26.00MBOK (1 test, 1 assertion)
Now the negative unit testing is complete! How have you been in this journey? Constructive comment is welcome!