【发布时间】:2019-01-22 06:01:12
【问题描述】:
我有以下路线:
Route::get('echo',function (Request $req) {
return response()->stream(function () use ($req) {
echo json_encode($req->all());
}, 200, [
'Content-Type' => 'application/json'
]);
})->name('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() 也不起作用,因为它似乎直接调用了硬编码为返回false 的StreamedResponse::getContent()。
我使用以下方法取得了一些有限的成功:
ob_start();
$response->sendContent();
$result = ob_get_clean();
然而,这在单元测试中看起来是一件非常草率的事情。
有没有其他人遇到过这种情况?是否可以测试流式响应的内容?
【问题讨论】: