0
我的大多數單元測試都使用WithoutMiddleware,因此我可以測試控制器和資源端點。然而,路由模型綁定是一箇中間件,所以控制器沒有得到他們需要的模型。單元測試期間,如何使Laravel中的路由模型綁定工作?
我的大多數單元測試都使用WithoutMiddleware,因此我可以測試控制器和資源端點。然而,路由模型綁定是一箇中間件,所以控制器沒有得到他們需要的模型。單元測試期間,如何使Laravel中的路由模型綁定工作?
創建僅在測試期間運行的服務提供者。 - 首先確保你在phpunit.xml中設置了APP_ENV - 接下來爲laravel創建服務提供者,如下圖所示。 (不要忘了將它添加到配置/ app.php的供應商部分)
phpunit.xml
...<php>
<env name="APP_ENV" value="testing"/>
...
</php>...
配置/ app.php
...providers=>[..., App\Providers\PhpUnitServiceProvider::class, ...]
應用/供應商/ PhpUnitServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class PhpUnitServiceProvider extends ServiceProvider{
/**
* Map of classes you want route-model binding to work
* based on a variable name in the route.
*
* example: http://localhost/bank-accounts/{bank_account}
*
* @var array
*/
private static $map = [
\App\Financial\BankAccount::class => 'bank_account',
];
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot(){
//
}
/**
* We need to simulate route-model binding.
*
* @return void
*/
public function register(){
//
if(env('APP_ENV') == 'testing'){
$classes = array_keys(static::$map);
foreach($classes as $class){
$this->app->bind($class, function ($app) use ($class){
return self::factory($class, $app);
});
}
}
}
private static function factory($class, $app){
if(empty(static::$map[$class])){
return null;
}
$request = request();
$target = static::$map[$class];
if(empty($request->$target)){
return null;
}
$id = $request->$target;
return $class::find($id);
}
}