如何解决PUT 请求不会将嵌套集合更新为测试在之前执行另一个请求时工作
执行唯一测试时,PUT 请求不会更新嵌套集合。
- 如果我运行所有测试套件
PHP bin/PHPunit
,它就可以工作。 - 如果我通过 HTTP 客户端(邮递员、cURL...)发出请求,它会起作用。
- 但是如果我只运行这个唯一的测试
PHP bin/PHPunit --filter=testEditCategory
,它就会失败。其他所有字段(此处为name
、description
)都正确更新,但parameters
(Parameter
的集合)未正确更新。
在我的应用程序的所有其他嵌套集合中都观察到了与 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 举报,一经查实,本站将立刻删除。