如何设置单元测试使用哪个 Symfony 环境?

How to setup which Symfony environment is used by unit tests?

我正在尝试设置一个名为 travis 的新 Symfony 环境,以便在 Travis 容器中进行 运行 单元测试。

我设置此环境是为了将其与 proddev 区分开来。

目前,我有:

>

language: php

php:
  - "7.2.17"

services:
  - mysql

install:
  - composer install --no-interaction
  - echo "USE mysql;\nUPDATE user SET password=PASSWORD('${MYSQL_PASSWORD}') WHERE user='root';\nFLUSH PRIVILEGES;\n" | mysql -u root
  - ./bin/console doctrine:database:create --env=travis
  - ./bin/console doctrine:migration:migrate --env=travis --no-interaction

script:
  - ./vendor/bin/simple-phpunit

我的项目是这样的:

我运行宁的一些测试示例:

UserTest.php 测试 User.php 模型:

<?php
namespace Tests\AppBundle\Entity;

use AppBundle\Entity\User;
use PHPUnit\Framework\TestCase;
use AppBundle\Entity\Responsibility;

class UserTest extends TestCase
{
    public function testId()
    {
        $user = new User();
        $id = $user->getId();
        $this->assertEquals(-1, $id);
    }
}

LoginControllerTest.php 测试 LoginController.php 控制器:

<?php
namespace Tests\AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\BrowserKit\Cookie;
use Symfony\Component\HttpFoundation\Response;

class LoginControllerTest extends WebTestCase
{
    /*
     * Test the login form
     * Logins with (admin, password : a)
     */
    public function testLogin()
    {
        // Create a new client to browse the app
        $client = static::createClient();
        $crawler = $client->request('GET', '/login');
        $this->assertEquals(200, $client->getResponse()->getStatusCode(), "Unexpected HTTP status code for GET ");
        // Get the form
        $form = $crawler->selectButton('Connexion')->form();
        // Fill the login form input
        $form['_username']->setValue('admin');
        $form['_password']->setValue('a');
        // Send the form
        $client->submit($form);
        $crawler = $client->followRedirect();
        $this->assertContains(
                'Bienvenue admin.' ,
                $client->getResponse()->getContent()
        );

        return array($client,$crawler);
    }
}

我的问题是:所有命令 运行 进入 travis 环境,单元测试除外。我希望能够 运行 在我的计算机上的 dev env 中进行单元测试,但在 Travis 容器中的 travis env 中进行单元测试。

如何设置我的 PHPUnit 以便它可以在 travis 环境中 运行 并使用我的 config_travis.yml 文件?

WebTestCasecreateClient() 方法从 KernelTestCase 调用 bootKernel() 方法,后者又调用 createKernel()。在 createKernel() 中有以下代码确定内核应该在哪个环境中启动:

if (isset($options['environment'])) {
    $env = $options['environment'];
} elseif (isset($_ENV['APP_ENV'])) {
    $env = $_ENV['APP_ENV'];
} elseif (isset($_SERVER['APP_ENV'])) {
    $env = $_SERVER['APP_ENV'];
} else {
    $env = 'test';
}

因此,在您的情况下,导出 config_travis.yml 文件中的 APP_ENV 变量并将其设置为 travis 应该可以解决问题。

PHPUnit 使用名为 APP_ENV 的环境变量来确定使用哪个环境。我必须在 Travis 中创建这个环境变量。