2017-12-02 264 views
3

我正在構建一個小的Laravel應用程序,我想用phpunit測試它。是一個非常簡單的應用程序有一個控制器:Phpunit測試Laravel控制器

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use GuzzleHttp\Client; 

class MyController extends Controller 
{ 
    protected $client; 

    public function __construct(Client $client) 
    { 
     $this->client = $client; 
    } 

    public function doSomething(Request $request) 
    { 
     ... 

     $this->client->post(...); 

     ... 
    } 
} 

所以,你可以看到我傳遞狂飲對象控制器(我的想法是用mock handler以取代客戶端我要測試是否。函數DoSomething的是做什麼的,我期待,但我不知道該怎麼稱呼它

我可以很容易地(在我MyControllerTest)做這樣的事情:

$controller = new MyController($fakeGuzzleObject); 

但後來,我怎麼能調用doSomething並傳遞Request實例?

或者我可以這樣做:

$this->get(route/to/access/doSomething) 

而讓Laravel注入的請求,但我怎麼能告訴它使用一個嘲笑狂飲實例?

+0

我想你可以''this-> app-> instance(Client :: class,new FakeClient)'在你的測試裏面。 – Camilo

回答

0

這兩個選項都非常簡單。

第一選擇:

您可以撥打像$controller->doSomething(new Request(['data' => 'data']))

第二個選項控制器操作:

如果你$this->get(...),並希望自定義類在構造函數中注入只是將其綁定:

$this->app->bind(\GuzzleHttp\Client::class, function() { $client = new GuzzleHttp\Client(); });

我建議使用第二個選項。

+0

非常感謝您的回答。第二個選項可以在MyControllerTest類中完成?我的意思是,我可以在該課程的任何地方或僅在setUp方法中執行此操作嗎? –

+1

你可以在課堂的任何地方做到這一點,但在你提出要求之前 – Bostjan