Laravel Response :: download()测试

时间:2014-01-13 12:19:49

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

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

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

知道如何测试吗?我试过使用shouldReceive(),但似乎不起作用('shouldReceive()未定义函数....')。

4 个答案:

答案 0 :(得分:3)

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

  

Illuminate \ Support \ Facades \ Response类实际上并未扩展   照亮\支持\外墙\门面所以没有shouldRecieve()   方法。调用后,您需要测试此路由的响应   在测试中。


因此,如果要测试下载功能,可以尝试使用以下命令检查错误响应:

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

答案 1 :(得分:1)

您可以声明状态代码为200

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

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

我还断言响应标题中有attachment

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

答案 2 :(得分:1)

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

<块引用>

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

<块引用>

$response->assertDownload();

了解更多:

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

答案 3 :(得分:0)

您可以使用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
}