6

我一直在使用 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 逻辑,使数据库中充斥着污染后续测试运行的测试数据,并且还会产生一些副作用,例如无法解决问题刷新前的最后一篇文章。

我很困惑我在这里做错了什么。我已经跟踪了几层的请求处理,直到我在下面的所有容器魔法中丢失了它,并且在那里找不到任何明显的错误。

4

1 回答 1

3

经过大量的试验和错误,我发现Facade::clearResolvedInstances()在每次 http 调用后调用可以使连续的 http 调用正常工作。这似乎避免了破坏来自 refreshApplication 的数据库事务的副作用。我最终包装了所有 http 动词方法,以这种方式自动调用该方法:

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

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

于 2016-08-02T13:58:40.223 回答