我一直在使用 laravel 组件在 lumen5.2 中编写我的 phpunit 测试时遇到问题。如果我在单个测试中对我的 API 进行多次 http 调用,则我为后续调用提供的主体将被忽略,而优先提供给测试中任何 http 调用的第一个主体。使用 MakesHttpRequests 中的任何可用方法都会出现此问题,例如 post() 或 put() 或 call()。该问题与此处和此处讨论的问题相似但不完全相同,但它们的解决方案不适用或无法解决我的问题。我将其提炼为以下行为:
回声测试.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"]);
}
}
回声控制器.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']);
}
}
路由.php
<?php
$app->post('echo', ['uses' => 'EchoController@_echo']);
输出
.string(5) "first"
string(5) "first"
string(5) "first"
我发现$this->refreshApplication()
在每次发布调用后调用都会有所帮助,但也会破坏 DatabaseTransactions 逻辑,使数据库中充斥着污染后续测试运行的测试数据,并且还会产生一些副作用,例如无法解决问题刷新前的最后一篇文章。
我很困惑我在这里做错了什么。我已经跟踪了几层的请求处理,直到我在下面的所有容器魔法中丢失了它,并且在那里找不到任何明显的错误。