gpt4 book ai didi

php - 在 laravel 测试中进行多次发布调用时发布主体被忽略

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:45 25 4
gpt4 key购买 nike

我在使用 laravel 组件在 lumen5.2 中编写我的 phpunit 测试时遇到了问题。如果我在单个测试中对我的 API 进行多次 http 调用,我为后续调用提供的正文将被忽略,而优先提供给测试中任何 http 调用的第一个正文。使用 MakesHttpRequests 中的任何可用方法(例如 post() 或 put() 或 call())都会出现问题。该问题与讨论的问题相似但不完全相同 herehere ,但他们的解决方案不适用或无法解决我的问题。我将其提炼为以下行为:

echo 测试.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']);
}
}

路由.php

<?php

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

输出

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

我发现在每次 post 调用后调用 $this->refreshApplication() 会有所帮助,但也会破坏 DatabaseTransactions 逻辑,使数据库中散落着测试数据,从而污染后续测试运行,并且还有一些副作用,比如在刷新之前没有解决最后一篇文章的问题。

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

最佳答案

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

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

我仍然不知道为什么需要这样的东西。

关于php - 在 laravel 测试中进行多次发布调用时发布主体被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37418155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com