2017-12-02 262 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