我的一条路线中有以下代码:
return Response::download('cv.pdf');
知道如何测试吗?我试过使用shouldReceive(),但似乎不起作用('shouldReceive()未定义函数....')。
答案 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();
了解更多:
答案 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
}