This morning was spent fixing something, which frankly, I should have known better! However, when you’re coding and project managing on your own, it’s not easy to keep everything rolling.
When I write new Repository methods, I leave a comment note @totest
to remind me to come back and write some tests!
However, I’ve missed writing 2 simple types of tests which would have taken 20 mins and then saved me an hour this morning. So I thought I’d share with you lot.
In My Laravel Middleware I have a method which checks the UserId provided is one of our students.
$user = $this->userRepo->findByUidOrFail($this->fetchUser());
However, because I haven’t filled in any tests on that Repo yet, I’ve been going around the houses trying to fix a problem which some simple unit tests would have flagged 2 days ago. The return wasn’t erroring if the user isn’t there AND was returning a Collection
when it should have been giving me a Model
…
So along with unit testing positive results from a successful method call, we should be writing two other types of tests.
The Exception Test.
Clearly this method name says, find…OR FAIL!!!! However, it wasn’t throwing a ModelNotFoundException
on failing, it was just returning a Collection
!
The tests I have written to assert it’s working now,
// UserRepositoryInterfaceTest.php
/**
* @expectedException ErrorException
*/
public function test_findByUidOrFail_incorrect_params()
{
$records = $this->theRepo->findByUidOrFail();
}
/**
* @expectedException IlluminateDatabaseEloquentModelNotFoundException
*/
public function test_findByUidOrFail_modelNotFound()
{
$this->theRepo->findByUidOrFail("foo");
}
The returned type Test.
It seems weird to test you’re getting the write variable type back, however, it’s crucially important. Because what if you expect an integer, 2, and you’re returned a string of “2”. Any triple if’s === would fail and probably throw something else off.
So we test for cast types. In this example, I assert the Model by looking for a certain method’s availability or not.
// UserRepositoryInterfaceTest.php
public function test_findByUidOrFail_is_model()
{
$record = $this->helper->createAUser();
$result = $this->theRepo->findByUidOrFail($record->uid);
$this->helper->assertIsModel($result);
}
// TestHelper.php
public function assertIsModel($obj)
{
PHPUnit::assertEquals(
method_exists($obj, 'getTable'),
true,
'obj is not a Model'
);
}