2017-12-02 12 views
3

私は小さなLaravelアプリケーションを構築しています。私はphpunitを使ってテストしたいと思います。一方のコントローラと非常にシンプルなアプリケーションです:あなたは、私はコントローラにがつがつ食うオブジェクトを渡している見ることができるようにphpunit testing Laravel controller

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

2番目のオプションを使用することをお勧めします。

+0

お返事ありがとうございました。 2番目のオプションはMyControllerTestクラス内で行うことができますか?つまり、そのクラスのどこにでも、setUpメソッドでのみどこでも実行できますか? –

+1

これはクラス内のどこでも実行できますが、リクエストを行う前に – Bostjan