如何针对 API 运行 webtestcase?关于功能测试的默认指南仅给出以下命令:
$client = static::createClient();
$crawler = $client->request('GET', '/some-url');
Crawler 类是一个 DOM 爬虫。我检查了 FrameworkBundle\Client 类的引用,但找不到允许我发出返回原始响应的请求的方法。至少这样,我将能够对输出进行 json_decode 并进行测试。
我可以用什么来实现这个目标?
完成
$client->request(...)
调用后,您可以执行 $client->getResponse()
来获取服务器响应。
然后您可以断言状态代码并检查其内容,例如:
$client->request('GET', '/my-url');
$response = $client->getResponse();
$this->assertSame(200, $response->getStatusCode());
$responseData = json_decode($response->getContent(), true);
// etc...
自
此提交以来,有一个
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);
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
字符串的标准化。
我决定创建一个中间类来处理 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分离。