【问题标题】:Laravel 5.1 doesn't allow you to pass in url params (is there configuration)Laravel 5.1 不允许你传入 url 参数(是否有配置)
【发布时间】:2015-10-01 21:05:05
【问题描述】:

考虑以下测试:

public function it_should_contain_a_list_of_investors_who_belong_to_one_or_more_investment() {
    $this->createInvestment();

    $investor = factory(User::class)->create([
        'role_id' => 4
    ]);

    $response = $this->actingAs($investor)
                     ->call('GET', 'api/v1/investors?include=investments');

    dd(json_decode($response->getContent()));
    $this->assertNotEmpty(json_decode($response->getContent()));
}

现在考虑该测试调用的以下操作:

public function getAllInvestorsForCompany($slug)
{
    $users = $this->investorEntity->usersForCompany($slug);

    $resource = new Collection($users, new InvestorTransformer, 'investor');
    dd($_GET);
    if (isset($_GET['include'])) {
        $usersData = $this->manager->parseIncludes($_GET['include'])->createData($resource)->toArray();
    } else {
        $usersData = $this->manager->createData($resource)->toArray();
    }

    return response()->json($usersData);
}

注意dd,$_GET 返回 []

让我们在浏览器中做同样的测试:

array:1 [▼
  "include" => "investments.offering.company"
]

好的,所以在浏览器中我返回了investments.offering.company,因为这是我作为?include= 传递的内容,但在测试中,它就像 laravel 一样忽略了 ?include 并继续前进。

这是 laravel 5.1 测试的默认行为吗?如果是,我该如何关闭它?

【问题讨论】:

  • $_GET 在控制台请求期间不会被填充,因为您的控制台应用程序实际上并没有发出请求。而是通过应用程序运行请求的操作

标签: php unit-testing laravel testing laravel-5.1


【解决方案1】:

不要在 Laravel 控制器中使用 $_GET、$_POST 或 $_REQUEST。你应该使用Request门面:

public function getAllInvestorsForCompany($slug)
{
    $users = $this->investorEntity->usersForCompany($slug);

    $resource = new Collection($users, new InvestorTransformer, 'investor');

    if (Request::input('include')) {
        $usersData = $this->manager->parseIncludes(Request::input('include'))->createData($resource)->toArray();
    } else {
        $usersData = $this->manager->createData($resource)->toArray();
    }

    return response()->json($usersData);
}

在测试时,Laravel实际上不会进行 HTTP 调用——它会创建一个 Request 对象,然后将其传递给路由控制器,这就是这些变量实际上不可用的原因。

使用Request 外观还允许您执行诸如在输入不存在时设置默认值并处理多个输入表单(例如 AngularJS 在请求正文中以 JSON 格式发送数据,而不是 POST 或GET 参数)。

【讨论】:

  • 那么如何使用 Request 对象设置?include=?
  • 按原样发送 URL。 Request 对象将解析查询字符串并自动将其转换为参数。在内部,它使用来自Symfony 的Request 对象,然后在顶部添加了一些额外的功能。见Symfony Source code
  • 您还可以发送关联数组或参数作为call 方法中的第三项,这将优先于查询字符串中传递的任何内容,但两者都可以正常工作。
【解决方案2】:

call 的第三个参数是参数。

$response = $this->actingAs($investor)
    ->call('GET', 'api/v1/investors', ['include' => 'investments']);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-16
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多