Reputation: 619
I want to mock Carbon::now()
and Transaction::where...
(eloquent model in laravel) with Mockery. Is it possible? I don't have any idea how can I do this when code is written without dependency injection
class SomeClass
{
public function getLatest()
{
$cacheTime = Carbon::now();
if ($cacheTime > 'xxxx') {
return 'abcdefgh';
}
return Transaction::where('base', '=', 'asas')
->where('target', '=', 'bbbb')
->orderByDesc('created_at')
->first();
}
}
Upvotes: 0
Views: 752
Reputation: 2065
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
Upvotes: 1