2017-12-02 2 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와 해당 클라이언트를 대체하는 것입니다 나는 경우 테스트하려는. 기능 해봐요 내가 기대하고있어하지만 난 그것을 호출하는 방법을 모르는 무엇을하고있는

이 이 같은 것을

내가 쉽게 (내 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

관련 문제