我有以下路线:
Route::get('echo',function (Request $req) {
return response()->stream(function () use ($req) {
echo json_encode($req->all());
}, 200, [
'Content-Type' => 'application/json'
]);
})->name('echo');
为了简单起见,我们假设这是一个简单的 echo 响应。实际上这是一个非常大的文件。两种情况下的结果都是一样的。
现在我想测试这条路线,看看我是否真的能看到那个 json 内容,所以我试过这个:
public function testBasicTest()
{
$response = $this->get(route('echo', [
"content"=>"some content"
]));
$response->assertSeeText("some content"); //Doesn't work
$response->assertJson( [
"content"=>"some content"
]); //Neither does this
}
我进一步检查了一下,这似乎是因为 (a) 响应包裹在 TestResponse
周围 (b) 响应内容永远不会流式传输,并且 (c) 即使响应内容将通过 $response->baseResponse->sendContent()
强制流式传输 实际内容被回显而不是由 TestResponse
此外,调用 $response->getContent()
也不起作用,因为它似乎直接调用了硬编码返回的 StreamedResponse::getContent()
错误
。
我使用以下方法取得了一些有限的成功:
ob_start();
$response->sendContent();
$result = ob_get_clean();
然而,这在单元测试中看起来像是一件非常草率的事情。
有没有人遇到过这个?是否可以测试流式响应的内容?
最佳答案
这不是一个好的解决方案,更像是一个 hack,但如果其他人遇到此问题,您可以执行以下操作:
public function testBasicTest()
{
$response = $this->get(route('echo', [
"content"=>"some content"
]));
if ($response->baseResponse instanceof StreamedResponse) {
ob_start();
$response->sendContent();
$content = ob_get_clean();
$response = new TestResponse(
new Response($content,
$response->baseResponse->getStatusCode(),
$response->baseResponse->headers->all()
)
);
}
$response->assertSee("some content"); //Works
}
关于php - 测试流式响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51857346/