【问题标题】:Laravel Response::download() testLaravel 响应::download() 测试
【发布时间】:2014-02-01 04:34:28
【问题描述】:

我的一条路线中有以下代码:

return Response::download('cv.pdf');

知道如何测试吗?我尝试使用 shouldReceive() 但这似乎不起作用('shouldReceive() undefined function....')。

【问题讨论】:

  • Illuminate\Support\Facades\Response 类实际上并没有扩展Illuminate\Support\Facades\Facade 所以没有shouldRecieve() 方法。您需要在测试中调用该路由后测试该路由的响应。
  • @DavidBarker 我用 laravel 8 测试过,响应门面现在有 shouldRecieve()

标签: unit-testing laravel laravel-4 phpunit mockery


【解决方案1】:

$response->assertDownload() 在 Laravel 8.45.0 中添加:

断言响应是“下载”。通常,这意味着返回响应的调用路由返回 Response::download 响应、BinaryFileResponse 或 Storage::download 响应:

$response->assertDownload();

了解更多:

https://laravel.com/docs/8.x/http-tests#assert-download

【讨论】:

  • 感谢您提供此信息,但有没有办法测试文件的“内容”而不仅仅是响应标头?
  • (在我的例子中,下载的端点是一个基于输入参数动态生成和签名的文件)
  • 如果“内容”的 MIME 类型为 text/plain,则可能有一种测试内容的方法。但如果内容有 application/octet-stream 之类的内容,那么我认为您无法对其进行测试。
  • 谢谢。我意识到实际发生了什么(针对响应对象进行测试,而不是输出本身)并意识到我在做的是愚蠢的。如果内容是动态的,则不会从我正在使用的静态测试文件中提取,但会在内容中输出。因此,根据响应的内容断言我应该能够评估内容是正确的。傻我,谢谢。
【解决方案2】:

编辑:正如@DavidBarker 在他对 OP 问题的评论中指出的那样

Illuminate\Support\Facades\Response 类实际上并没有扩展 Illuminate\Support\Facades\Facade 所以没有 shouldRecieve() 方法。调用后需要测试该路由的响应 在测试中。


因此,如果您想测试您的下载功能,您可以尝试检查错误响应:

$this->assertTrue(preg_match('/(error|notice)/i', $response) === false);

【讨论】:

    【解决方案3】:

    你可以断言状态码是200

    $this->assertEquals($response->getStatusCode(), 200);
    

    因为有时您可能会返回一些匹配“错误”或“通知”的数据,这会产生误导。

    我还断言响应标头中有一个attachment

    $this->assertContains('attachment', (string)$response);
    

    【讨论】:

    • 对于那些从 2020 年开始的人:$this->assertEquals('attachment; filename=cv.pdf', $response->headers->get('content-disposition'));
    【解决方案4】:

    您可以使用Mockery 模拟download 方法,为此您需要模拟ResponseFactory

    public function testDownloadCsv()
    {
        $this->instance(
            ResponseFactory::class, Mockery::mock(ResponseFactory::class, function ($mock) {
            $mock->shouldReceive('download')
                ->once()
                ->andReturn(['header' => 'data']);
        }));
    
        $response = $this->get('/dowload-csv');
    
        $response->assertStatus(Response::HTTP_OK);
        $response->assertJson(['header' => 'data']); // Response
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-19
      • 2022-01-20
      • 1970-01-01
      • 2020-03-31
      • 2023-03-15
      • 2021-04-08
      • 2019-04-27
      • 1970-01-01
      相关资源
      最近更新 更多