集成测试 JSON API 响应
Integration Testing JSON API Response
我目前正在为我的 API 编写一些测试,我很想知道是否有更好的方法来处理这个问题,因为我觉得这是 "hacky" 的方法做事。
下面的代码示例:
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 不是我的答案。
首先,我不认为像您现在所做的那样以编程方式断言某个 JSON 结构本身是不好的做法。但是,我确实同意它在某些时候可能会变得麻烦并且可以更有效地解决。
我刚才遇到了同样的问题,最后写了一个新的 Composer 包(helmich/phpunit-json-assert
,这是 available as open source) that uses JSON schemata and JSONPath expressions 用于验证给定 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 模式,因为它是一个被广泛采用的标准并且(恕我直言)更容易阅读 assert*
语句的墙。您还可以将单元测试中的模式定义提取到单独的文件中,并用它们做其他事情;例如自动生成文档(Swagger 也使用 JSON 模式的一个子集)或 运行 时间验证。
我目前正在为我的 API 编写一些测试,我很想知道是否有更好的方法来处理这个问题,因为我觉得这是 "hacky" 的方法做事。
下面的代码示例:
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 不是我的答案。
首先,我不认为像您现在所做的那样以编程方式断言某个 JSON 结构本身是不好的做法。但是,我确实同意它在某些时候可能会变得麻烦并且可以更有效地解决。
我刚才遇到了同样的问题,最后写了一个新的 Composer 包(helmich/phpunit-json-assert
,这是 available as open source) that uses JSON schemata and JSONPath expressions 用于验证给定 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 模式,因为它是一个被广泛采用的标准并且(恕我直言)更容易阅读 assert*
语句的墙。您还可以将单元测试中的模式定义提取到单独的文件中,并用它们做其他事情;例如自动生成文档(Swagger 也使用 JSON 模式的一个子集)或 运行 时间验证。