微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PUT 请求不会将嵌套集合更新为测试在之前执行另一个请求时工作

如何解决PUT 请求不会将嵌套集合更新为测试在之前执行另一个请求时工作

执行唯一测试时,PUT 请求不会更新嵌套集合。

  • 如果我运行所有测试套件 PHP bin/PHPunit,它就可以工作。
  • 如果我通过 HTTP 客户端(邮递员、cURL...)发出请求,它会起作用。
  • 但是如果我只运行这个唯一的测试 PHP bin/PHPunit --filter=testEditCategory,它就会失败。其他所有字段(此处为 namedescription)都正确更新,但 parametersParameter 的集合)未正确更新。

在我的应用程序的所有其他嵌套集合中都观察到了与 PUT 请求相同的行为。

使用:

  • Symfony 5.2
  • API 平台 2.5.9
  • 带有 hautelook/alice-bundle 2.8 的装置

运行测试:PHP bin/PHPunit --filter=testEditCategory

以下测试不会通过:

class CategoryTest extends ApiTestCase {

    use RefreshDatabaseTrait;

    public function testEditCategory(): void
    {
        $data = [
            'name' => 'Edited','description' => 'Edited',"parameters" => []
        ];

        $response = $this->request(
            'PUT',$this->getResourceIri(Category::class,['name' => 'foobar']),$data,['Authorization' => 'Bearer '.self::VALID_JWT]
        );

        $json = json_decode((string)$response->getContent(),true,512,JSON_THROW_ON_ERROR);
        self::assertEmpty($json['parameters']);
    }

    // ...

返回:

1) App\Tests\Functional\Api\CategoryTest::testEditCategory
Failed asserting that an array is empty.

但是这里出现了奇怪的行为:当我之前执行任何其他 HTTP 请求时,进入测试方法......测试通过:

// ...
$this->request('GET','https://www.google.com');
$response = $this->request(
        'PUT',['name' => 'category_1']),['Authorization' => 'Bearer '.self::VALID_JWT]
);
// ...

ApiTestCase.PHP :

class ApiTestCase extends WebTestCase
{
    protected Kernelbrowser $client;

    /** @var string */
    public const VALID_JWT = 'valid_token';

    protected function setUp(): void
    {
        parent::setUp();

        $this->client = static::createClient();
    }

    /**
     * @param string $method
     * @param string $uri
     * @param mixed $content
     * @param array $headers
     * @return Response
     * @throws JsonException
     */
    protected function request(string $method,string $uri,$content = null,array $headers = []): Response
    {
        $server = ['CONTENT_TYPE' => 'application/ld+json','HTTP_ACCEPT' => 'application/ld+json'];
        foreach ($headers as $key => $value) {
            if ('content-type' === strtolower($key)) {
                $server['CONTENT_TYPE'] = $value;

                continue;
            }

            $server['HTTP_'.strtoupper(str_replace('-','_',$key))] = $value;
        }

        if (is_array($content) && false !== preg_match('#^application/(?:.+\+)?json$#',$server['CONTENT_TYPE'])) {
            $content = json_encode($content,JSON_THROW_ON_ERROR);
        }

        $this->client->request($method,$uri,[],$server,$content);

        return $this->client->getResponse();
    }
}

固定装置:

App\Entity\Category:
    category_1:
        name: 'category_1'
        description: 'category 1'


App\Entity\Parameter:
    parameter_1:
        name: 'parameter_1'
        category: '@category_1'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?