11 months ago

(PHPStorm) PHPUnit tests towards dockerized database woes

Posted 11 months ago by Breki

First a quick note on my setup:

I have a dev environment and a production environment, both running more or less the same code with APP_ENV and APP_URL being the only real differentiator - everything else is handled by internal logic. The site itself is powered by docker-compose, where I've got six different containers running various jobs (php-fpm, Horizon, redis, nginx, etc...). They talk to each other internally using their logical hostnames, so php-fpm only needs to make a call to the hostname postgres, and it is mapped to the right container. For that reason, my app.php file only contains pointers to these dynamic hostnames. One great benefit of this is that I can be very restrictive as to what is available "from outside". At the moment, for example, I'm only exposing ports 80, 443, and 6001 (websockets).

Now, the issue comes when I am doing development on this platform. Since PHPStorm isn't inside the docker container, it cannot see the database. Similarly, if I try to User::first() outside of the website context, it fails. I've somewhat resolved this by setting up a Docker container called workspace where I can run phpunit, php artisan tinker etc, as this container can see the database. But I can't seem to set up Test Driven Development workflows in PHPstorm...

Now, I've gathered that I need to be running "remote PHP" towards the workspace container, but every time I try to run PHPUnit from PHPStorm, it errors out and says:

    Testing started at 18:08 ...
    [docker://backend_workspace:latest/]:php /opt/.phpstorm_helpers/phpunit.php --configuration /var/www/phpunit.xml.dist

    Process finished with exit code 1
    Cannot find PHPUnit in include path (.:/usr/share/php)

.... Which is confusing, since I have no idea where it's taking the /opt/.phpstorm_helpers/phpunit.php pathname, and PHPUnit is definitely in the path of the workspace container.

Any thoughts?

Please sign in or create an account to participate in this conversation.