Phpunit 测试 Laravel 控制器

TJ *_*ort 5 php phpunit unit-testing laravel laravel-5

我正在构建一个小型 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(...);

        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,我正在控制器中传递 Guzzle 对象(我的想法是用模拟处理程序替换该客户端。我想测试函数 doSomething 是否正在执行我期望的操作,但我不知道怎么称呼。

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

$controller = new MyController($fakeGuzzleObject);
Run Code Online (Sandbox Code Playgroud)

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

或者,我可以执行以下操作:

$this->get(route/to/access/doSomething)
Run Code Online (Sandbox Code Playgroud)

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

小智 2

这两个选项都非常简单。

第一个选项:

您可以调用控制器操作,例如$controller->doSomething(new Request(['data' => 'data']))

第二个选项:

如果您这样做$this->get(...)并希望将自定义类注入到构造函数中,只需绑定它即可:

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

我建议使用第二个选项。