Symfony Web 测试用例 JSON

问题描述 投票:0回答:4

如何针对 API 运行 webtestcase?关于功能测试的默认指南仅给出以下命令:

$client = static::createClient();
$crawler = $client->request('GET', '/some-url');

Crawler 类是一个 DOM 爬虫。我检查了 FrameworkBundle\Client 类的引用,但找不到允许我发出返回原始响应的请求的方法。至少这样,我将能够对输出进行 json_decode 并进行测试。

我可以用什么来实现这个目标?

json symfony functional-testing
4个回答
34
投票

完成

$client->request(...)
调用后,您可以执行
$client->getResponse()
来获取服务器响应。

然后您可以断言状态代码并检查其内容,例如:

$client->request('GET', '/my-url');
$response = $client->getResponse();
$this->assertSame(200, $response->getStatusCode());
$responseData = json_decode($response->getContent(), true);
// etc...

11
投票

此提交
以来,有一个PHPUnit\Framework\Assert::assertJson()方法 您还可以测试
Content-Type
响应标头。

$response = $client->getResponse();
$this->assertTrue($response->headers->contains('Content-Type', 'application/json'));
$this->assertJson($response->getContent());
$responseData = json_decode($response->getContent(), true);

5
投票

willdurand/rest-extra-bundle 捆绑包提供了额外的帮助器来测试 JSON。为了测试相等性,已经有一个用于此目的的内置断言:

use Bazinga\Bundle\RestExtraBundle\Test\WebTestCase as BazingaWebTestCase;

// ...

$client->request('GET', '/my-url');
$response = $client->getResponse();
$this->assertJsonResponse($response, Response::HTTP_OK);
$this->assertJsonStringEqualsJsonString($expectedJson, $response);

请注意,

assertJsonStringEqualsJsonString
断言将负责
$expectedJson
$response
字符串的标准化。


0
投票

我决定创建一个中间类来处理 Doctrine 实体和领域模型之间的映射。这是我的处理方法:

final readonly class DoctrineUserBrokerRepository implements UserRepositoryInterface {
public function __construct(private DoctrineUserRepository $doctrineUserRepository): array
{
}

public function findAll(): array
{
    $userEntities = $this->doctrineUserRepository->findAll();

    return array_map([$this, 'convertEntityToModel'], $userEntities);
}

private function convertEntityToModel(UserEntity $userEntity): User
{
    return new User(
        $userEntity->getId(),
        new Email($userEntity->getEmail()),
        $userEntity->getPassword(),
        $userEntity->getRoles()
    );
}

在此解决方案中,DoctrineUserBrokerRepository充当基础设施层(Doctrine)和领域层(User model)之间的桥梁。 findAll() 和 find() 方法与 Doctrine 交互,但返回域模型。转换逻辑封装在convertEntityToModel()方法中,保持领域逻辑与Doctrine分离。

© www.soinside.com 2019 - 2024. All rights reserved.