Phpunit测试Laravel控制器

时间:2017-12-02 20:22:12

标签: php laravel unit-testing laravel-5 phpunit

我正在构建一个小型的Laravel应用程序,我想使用phpunit进行测试。使用一个控制器是一个非常简单的应用程序:

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

        ...
    }
}

所以,正如你可以看到我在控制器中传递Guzzle对象(我的想法是用mock handler替换该客户端。我想测试函数doSomething是否正在做我所做的事情&# 39;我期待,但我不知道怎么称呼它。

我可以轻松地(在我的MyControllerTest中)执行以下操作:

$controller = new MyController($fakeGuzzleObject);

但是,如何调用doSomething并传递Request实例?

或者我可以这样做:

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

让Laravel注入请求,但是如何告诉它使用模拟的Guzzle实例?

1 个答案:

答案 0 :(得分:1)

这两个选项都非常简单。

第一个选项:

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

一样调用控制器操作

第二个选项:

如果你执行$this->get(...)并希望在构造函数中注入自定义类,只需绑定它:

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

我建议使用第二种选择。