我想用Mockery模仿Carbon::now()
和Transaction::where...
(laravel中的雄辩模型)。可能吗?在没有依赖注入的情况下编写代码时,我不知道如何才能这样做
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();
}
}
答案 0 :(得分:1)
您可以轻松模拟 ->where('current_transaction.created_by' ,'!=', DB::raw('current_transaction.user_id'))
:
http://carbon.nesbot.com/docs/#api-testing
Carbon
因此,在您的单元测试中,只需在函数调用之前调用$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
。
这样的事情:
Carbon::setTestNow($knownDate);
我认为您不能在代码中模拟public function testGetLatest()
{
$knownDate = Carbon::create(2001, 5, 21, 12); // create testing date
Carbon::setTestNow($knownDate);
$someClass = new SomeClass;
$result = $someClass->getLatest();
...
}
,并且没有目的。 Transaction::where
和where
功能只是设置您的查询。 orderByDesc
函数实际上将返回first
对象。即使您可以模拟或存根Transaction
函数,那么您的测试也没用,因为您正在测试您的first
函数返回由您创建的某种模拟对象。
这实际上是集成测试的一个很好的例子,Laravel提供了各种有用的工具来简化它。看看这个链接:
https://laravel.com/docs/5.5/database-testing#writing-factories