Тестирование интеграции JSON API Response

В настоящее время я пишу несколько тестов для своего API, и мне любопытно узнать, есть ли лучший способ справиться с этим, так как я чувствую, что это «хакерский» способ делать вещи.

Пример кода ниже:

public function testListingOfAllUsers()
{
$users = $this->createUsers();

$client = $this->createClient();
$client->request("GET", "/users/");

$response = $client->getResponse();
$content = $response->getContent();
$decodedContent = json_decode($content);

$this->assertTrue($response->isOk());
$this->assertInternalType("array", $decodedContent->data);
$this->assertCount(count($users), $decodedContent->data);

foreach ($decodedContent->data as $data) {
$this->assertObjectHasAttribute("attributes", $data);
$this->assertEquals("users", $data->type);
}
}

Мне интересно, есть ли что-то лучшее, что я могу сделать, чтобы проверить, что мой API соответствует спецификации JSON API. Просветите меня! Я уверен, что PHPUnit не мой ответ здесь.

1

Решение

Прежде всего, я не верю, что программное утверждение определенной структуры JSON, как вы делаете сейчас, является плохой практикой как таковой. Тем не менее, я согласен, что в какой-то момент это может стать громоздким и может быть решено более эффективно.

У меня была та же проблема некоторое время назад, и в итоге я написал новый пакет Composer (helmich/phpunit-json-assert, который доступный как открытый источник) который использует JSON схемы а также Выражения JSONPath для проверки структуры данного документа JSON.

Используя схему JSON, ваш пример теста может быть записан следующим образом:

public function testListingOfAllUsers()
{
$users = $this->createUsers();

$client = $this->createClient();
$client->request("GET", "/users/");

$response = $client->getResponse();
$content = $response->getContent();
$decodedContent = json_decode($content);

$this->assertTrue($response->isOk());
$this->assertJsonDocumentMatchesSchema($decodedContent, [
'type'  => 'array',
'items' => [
'type'       => 'object',
'required'   => ['attributes', 'type'],
'properties' => [
'attributes' => ['type' => 'object'],
'type'       => ['type' => 'string', 'enum' => ['user']]
]
]
]);
}

Несмотря на то, что я немного более многословен (в отношении строк кода), я оценил схемы JSON для этого варианта использования, поскольку это широко принятый стандарт и (imho) легче читать, что стена assert* заявления. Вы также можете извлечь определения схемы из ваших модульных тестов в отдельные файлы и делать с ними другие вещи; например, автоматически генерирующая документация (развязность также использует подмножество схемы JSON) или проверку во время выполнения.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]