phpunit测试方法里面有静态方法

时间:2017-12-05 00:00:59

标签: php unit-testing phpunit

我想用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();
   }
}

1 个答案:

答案 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::wherewhere功能只是设置您的查询。 orderByDesc函数实际上将返回first对象。即使您可以模拟或存根Transaction函数,那么您的测试也没用,因为您正在测试您的first函数返回由您创建的某种模拟对象。

这实际上是集成测试的一个很好的例子,Laravel提供了各种有用的工具来简化它。看看这个链接:

https://laravel.com/docs/5.5/database-testing#writing-factories