在Laravel测试中进行多个POST调用时被忽略的帖子正文

8
我在使用Lumen5.2与Laravel组件编写phpunit测试时遇到了问题。如果我在单个测试中对API进行多次http调用,那么我为后续调用提供的主体将被忽略,而优先选择测试中任何http调用中提供的第一个主体。这个问题出现在使用MakesHttpRequests中的任何可用方法时,例如post()、put()或call()。这个问题类似但不完全相同于这里这里讨论的问题,但他们的解决方案并不适用或不能解决我的问题。我已经将其简化为以下行为:

EchoTest.php

<?php

class EchoTest extends TestCase
{
    public function testEcho()
    {
        $this->json('POST', '/echo', ['string' => "first"]);
        $this->json('POST', '/echo', ['string' => "second"]);
        $this->json('POST', '/echo', ['string' => "third"]);
    }
}

EchoController.php

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Input;

class EchoController extends Controller
{
    public function _echo()
    {
        $input = Input::json()->all();
        var_dump($input['string']);
    }
}

routes.php

<?php

$app->post('echo', ['uses' => 'EchoController@_echo']);

输出

.string(5) "first"
string(5) "first"
string(5) "first"

我发现在每次post调用后调用$this->refreshApplication()可以在一定程度上帮助解决问题,但也会破坏DatabaseTransactions逻辑,导致数据库中留下测试数据,污染了后续的测试运行,并且还会产生类似于不修复刷新前最后一个post请求的问题。

我对自己到底做错了什么感到困惑。我已经追踪了请求处理的几个层级,直到我在所有容器魔法中失去了它,并且找不到任何明显的错误。

1个回答

3

经过多次尝试,我发现在每次http调用后调用Facade::clearResolvedInstances()可以使连续的http调用正常工作。这似乎避免了因刷新应用程序而导致破坏数据库事务的副作用。最终,我将所有http动词方法包装起来,以自动以这种方式调用该方法:

public function get($uri, array $headers = [])
{
    $ret = parent::get($uri, $headers);
    Facade::clearResolvedInstances();
    return $ret;
}

我仍然不知道为什么这样的事情是必要的。

2
当我向我的API发出get调用,然后使用一些参数进行post调用时,这些参数都不存在于注入到控制器操作中的Request对象中。看起来应用程序容器仍然保留着我第一个get调用的Request实例。在L5.5上,这个解决方法对我不起作用。实际上,$this->refreshApplication()也没有帮助。 - İlter Kağan Öcal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接