php - 测试流式响应

标签 php laravel phpunit

我有以下路线:

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/

相关文章:

php - 如何使用 Laravel 事务回滚

php - 在同一个文件中同时执行 PHP 和 JSP?

php - jQuery:如果 DatePicker UI 更改,则更新某个文本框

php - 在没有数据库的情况下使用 Laravel

php - 如何在 laravel 中使用 Controller 将多个变量传递给 View

php - 使用 PHPUnit 的测试数据库/数据进行功能测试

laravel phpunit - 为什么测试刷新实时数据库

php - 如何在完成 PHP 脚本执行之前接收 jQuery post 响应?

php - php 调用的 mysql 性能

phpunit 不那么冗长的输出