Phpunit 测试 Laravel Controller

标签 php laravel unit-testing laravel-5 phpunit

我正在构建一个小型 Laravel 应用程序,我想使用 phpunit 对其进行测试。是一个非常简单的应用程序,只有一个 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(...);

        ...
    }
}

因此,如您所见,我在 Controller 中传递了 Guzzle 对象(我的想法是用 mock handler 替换该客户端。我想测试函数 doSomething 是否正在执行我期望的操作,但我不知道怎么调用它。

我可以很容易地(在我的 MyControllerTest 中)做类似的事情:

$controller = new MyController($fakeGuzzleObject);

但是,我怎样才能调用 doSomething 并传递一个 Request 实例呢?

或者我可以做类似的事情:

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

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

最佳答案

这两个选项都非常简单。

第一个选项:

你可以像 $controller->doSomething(new 请求(['数据'=>'数据']))

第二个选项:

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

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

我建议使用第二个选项。

关于Phpunit 测试 Laravel Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47612192/

相关文章:

javascript - 为什么 vue js 在我的 laravel 项目中不起作用

laravel - 带有类别/子类别/文章标题的 SEO 友好 URL? [拉维尔]

java - JUnit - 测试网站

flutter - 使用 mocktail 包进行单元测试时,类型 'Null' 不是类型 'Future<void>' 的子类型

php - 如何在 MySQL 查询中设置日期间隔?

php - 如何在 Symfony 中为 example.com/username 创建路由并保留所有旧 URL

php - Laravel5 - 自定义验证器 - 未定义的 setPresenceVerifier()

php - SQL 结果作为 PHP 数组

Laravel - 从工作台/供应商包中读取文件

ruby-on-rails - Rails 3 测试框架困惑