我在使用laravel组件在lumen5.2中编写我的phpunit测试时遇到了问题。如果我在一次测试中对我的API进行多次http调用,则忽略我为后续调用提供的主体,以支持在测试中提供给任何http调用的第一个主体。使用MakesHttpRequests中的任何可用方法(例如post()或put()或call())会发生此问题。问题与here和here讨论的问题类似但不完全相同,但他们的解决方案不适用或不解决我的问题。我把它归结为以下行为:
<?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
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
$app->post('echo', ['uses' => 'EchoController@_echo']);
.string(5) "first"
string(5) "first"
string(5) "first"
我发现在每次调用后调用$this->refreshApplication()
会有所帮助,但也会破坏DatabaseTransactions逻辑,使数据库散落着污染后续测试运行的测试数据,并且还有一个一个侧面效果就像没有修复刷新前最后一篇文章的问题。
我很担心我在这里做错了什么。我已经跟踪了几层的请求处理,直到我在下面的所有容器魔法中丢失它并且在那里找不到任何明显的错误。
答案 0 :(得分:3)
经过大量的反复试验后,我发现在每次http调用后调用Facade::clearResolvedInstances()
会使连续的http调用正常工作。这似乎避免了破坏来自refreshApplication的数据库事务的副作用。我最终包装了所有的http动词方法,以这种方式自动调用方法:
public function get($uri, array $headers = [])
{
$ret = parent::get($uri, $headers);
Facade::clearResolvedInstances();
return $ret;
}
我仍然不知道为什么这样的事情是必要的。