Symfony4框架中单元测试和接口测试中的一些小坑
前提说明:
symfony 版本 4.1.*,使用 composer create-project symfony/website-skeleton 进行安装。
目标:在一个单元测试用例中对当前工程中的接口进行测试。使用PHPUnit。
坑1(发送请求使用 browser-kit):
browser-kit 只能对当前的应用进行发送接口请求,而且请求是不经过 index.php 的。
这样导致的问题就是如果当前的应用都是按照官方的指导配置去配置的话,比如数据库连接配置在 .env 中,那么如果请求不经过 index.php 的话,就无法加载 .env 文件。解决方法就是将数据库连接配置在 config/packages/doctrine.yaml 文件中。好了,现在数据库的连接问题解决了。
新的问题又来了,你在项目路径下的 tests 文件夹中创建了一个测试文件,比如 HomeTest.php,那么该继承哪个基类呢?正确答案是这个 Symfony\Bundle\FrameworkBundle\Test\WebTestCase,同时还需要指定 client 需要启动哪个 kernel,文档上说要指定kernel 的话需要复写 Symfony\Bundle\FrameworkBundle\Test\KernelTestCase 这个类中的 getKernelClass 或 createKernel 方法,好了现在你已经在 HomeTest.php 中复写了 getKernelClass 方法,并且指定了返回你自己的 kernel,该如何进行调用呢?这里需要用到,后期静态绑定这个知识点了。正确答案是使用 self 进行调用。
可以使用 xdebug 进行调试,因为是在同一个进程中。
坑2(发送请求使用 curl):
比如使用 GuzzleHttp,这样发送出去的请求是一个真正的 http 请求,因此会完整的按照 http 请求方式去执行,如同一个真正的请求发过来。
这样是会经过 index.php 的,无需将数据库配置在 config/packages/doctrine.yaml 中。
但是,这样的话由于不是当前的进程,那么如果想使用 xdebug 是不可能的,因为 xdebug 一旦开启监听就会阻塞所有的 php-fpm 进程。