唯一のテストが実行されると、PUT 要求はネストされたコレクションを更新しません。
- すべてのテスト スイートを実行する
php bin/phpunit
と、動作します。 - HTTP クライアント (Postman、cURL...) 経由でリクエストを行うと、機能します。
- しかし、この唯一のテストのみを実行する
php bin/phpunit --filter=testEditCategory
と、失敗します。他のすべてのフィールド (name
、description
ここ) は正しく更新されていますが、parameters
( のコレクションParameter
) は更新されていません。
PUT 要求での同じ動作が、アプリケーションの他のすべてのネストされたコレクションで観察されています。
使用:
- シンフォニー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',
$this->getResourceIri(Category::class, ['name' => 'category_1']),
$data,
['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'