You can easily mock Carbon
:
http://carbon.nesbot.com/docs/#api-testing
$knownDate = Carbon::create(2001, 5, 21, 12); // create testing date
Carbon::setTestNow($knownDate); // set the mock (of course this could be a real mock object)
echo Carbon::now(); // 2001-05-21 12:00:00
So in your unit test just call Carbon::setTestNow($knownDate);
before your function call.
Something like that:
public function testGetLatest()
{
$knownDate = Carbon::create(2001, 5, 21, 12); // create testing date
Carbon::setTestNow($knownDate);
$someClass = new SomeClass;
$result = $someClass->getLatest();
...
}
I don't think you can mock Transaction::where
in your code and there is no purpose of doing it. The where
and orderByDesc
functions just setting your query. The first
function will actually return the Transaction
object. Even if you could mock or stub the first
function, then your test is kind of useless because you are testing that your getLatest
function returns some kind of mock object created by you.
This is actually a good example of integration test and Laravel provides a variety of helpful tools to make it easier. Check out this link:
https://laravel.com/docs/5.5/database-testing#writing-factories