【问题标题】:In Laravel 8, how do I get the url of a request when unit testing?在 Laravel 8 中,如何在单元测试时获取请求的 url?
【发布时间】:2021-10-03 00:20:22
【问题描述】:

我想在 Laravel 8 中编写一个单元测试来测试一个创建新实体的 POST 请求。在该请求中,创建了一个 job_id,并且 URL 附加了 job_id。我想找回那个job_id。我该怎么做?

例如,

$route = route( 'job.store', $payload );
$response = $this->followingRedirects()->post( $route );

$response 应该重定向到类似http://localhost:9080/sales/job/J00561 的内容。我想获取网址,这样我就可以得到job_id,即J00561。

我该怎么做?

【问题讨论】:

  • 试试$response->headers->get('Location')
  • 我的标题中没有Location。我有content-type、cache-control、date 和set-cookie。
  • 这是因为您使用了 followRedirects - 而您的响应不是重定向
  • @Raza 您能否添加更多详细信息,因为尚不清楚您是如何做到的?您可以添加控制器方法以便我为您创建测试吗?

标签: php laravel phpunit


【解决方案1】:

对于这种情况,由于它不是 API,并且您无法从响应中获取已创建的作业 ID,因此我建议如下:

// create
$createResponse = $this->post(route('job.store', $payload))
    ->assertSuccessful();

// get created job by params
$job = Job::where($payload)->find();

// check creation
$this->assertNotNull($job);

// assert redirect
$createResponse->assertRedirect($showRoute = route('job.show', $jobId));
$this->get($showRoute)->assertSuccessful();

这是另一种方式:将标头的Location 解析为jobId,但在我看来这是错误的方式:

$response = $this->post(route('job.store', $payload))
   ->assertSucceful();

$params = explode('/', parse_url($response->headers->get('Location'))['path']);

$jobId = array_pop($params);
$response->assertRedirect($showRoute = route('job.show', $jobId));
$this->get($showRoute)->assertSuccessful();

【讨论】:

  • 请添加一些解释而不是纯代码答案。
  • @endo64 我可以在这里解释什么?请建议您的编辑,我真的无法想象我能写出关于这段代码的内容。
  • 我没有 $jobId 变量,我需要重定向的 url 来获取 uri 中的 jobId。
猜你喜欢
  • 2012-05-03
  • 1970-01-01
  • 2014-07-04
  • 2019-08-10
  • 2016-03-17
  • 2016-03-08
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多