阅读(1830)
赞(10)
Laravel 8 Facades
2021-07-08 16:55:54 更新
与传统静态方法调用不同的是,facades 也可以被模拟。相较传统的静态方法而言,它具有很大的优势,即便你使用依赖注入,可测试性不逊半分。在测试中,你可能想在控制器中模拟对 Laravel Facade 的调用。比如下面控制器中的行为:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Cache;
class UserController extends Controller
{
/**
* 显示该应用程序的所有用户的列表.
*
* @return Response
*/
public function index()
{
$value = Cache::get('key');
//
}
}
我们可以通过 shouldReceive
方法来模拟 Cache
Facade,此函数会返回一个 Mockery 实例。由于 Facade 的调用实际是由 Laravel 的 服务容器 管理的,所以
Facade 能比传统的静态类表现出更好的可测试性。下面,让我们模拟一下 Cache
Facade 的 get
方法:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Cache;
use Tests\TestCase;
class UserControllerTest extends TestCase
{
public function testGetIndex()
{
Cache::shouldReceive('get')
->once()
->with('key')
->andReturn('value');
$response = $this->get('/users');
// ...
}
}
注意:你不能模拟
Request
Facade 。相反,在运行测试时如果需要传入指定参数,请使用 HTTP 辅助函数,比如get
和post
。同理,请在测试时通过调用Config::set
来模拟Config
Facade。