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