У меня есть следующий маршрут:
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
}
Я проверил это немного дальше, и, похоже, это связано с тем, что (а) ответ обертывается вокруг TestResponse
(б) содержимое ответа никогда не передается в потоковом режиме и (в) даже если содержимое ответа должно было принудительно передаваться через $response->baseResponse->sendContent()
фактический контент воспроизводится, а не захватывается TestResponse
Кроме того, вызов $response->getContent()
не работает, потому что кажется, что он напрямую вызывает StreamedResponse::getContent()
, который жестко закодирован для возврата false
.
Мне удалось добиться некоторого ограниченного успеха, используя:
ob_start();
$response->sendContent();
$result = ob_get_clean();
однако это выглядит очень небрежно в модульном тесте.
Кто-нибудь еще сталкивался с этим раньше? Можно ли проверить содержимое потокового ответа?