BDD symfony 3清理数据库 - 驱动程序中发生异常:SQLSTATE [HY000] [2002]连接被拒绝

时间:2016-05-19 07:54:27

标签: bdd symfony

当我不尝试清理数据库时,一切正常 - 测试可以连接到数据库。

部分测试是:

namespace tests\ApiBundle\features\group_management\bootstrap;

use Behat\Behat\Context\Context;
use Behat\Behat\Context\SnippetAcceptingContext;
use tests\ApiBundle\features\WebApi;
use PHPUnit_Framework_Assert as Assertions;
//use Behat\Testwork\Hook\Scope\BeforeSuiteScope;
//use Behat\Testwork\Hook\Scope\AfterSuiteScope;
//use Behat\Behat\Hook\Scope\AfterScenarioScope;
use Behat\Behat\Hook\Scope\BeforeScenarioScope;

use Doctrine\ORM\EntityManager;

use NG\Model\Group\Group;

use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;

use Doctrine\Common\DataFixtures\Loader;
use tests\MyDataFixtures\LoadUserData;


/**
 * Defines application features from the specific context.
 */
class CreatingNewGroupContext implements Context, SnippetAcceptingContext
{
    /**
     * @var WebApi
     */
    private $webApi;

    /**
     * Initializes context.
     *
     * Every scenario gets its own context instance.
     * You can also pass arbitrary arguments to the
     * context constructor through behat.yml.
     *
     * @param WebApi $webApi web api
     */
    public function __construct(WebApi $webApi, EntityManager $entityManager)
    {
        $this->webApi = $webApi;
        $this->entityManager = $entityManager;

    }





    /** @BeforeScenario */
    public function before(BeforeScenarioScope $scope)
    {

        echo 'before ';

        $loader = new Loader();
        $loader->addFixture(new LoadUserData());

        $purger = new ORMPurger();
        $executor = new ORMExecutor($this->entityManager, $purger);
        $executor->execute($loader->getFixtures());

    }

正如您所看到的,之前有一个功能。最后一句话失败了。

在Doctrine中连接.php connect()函数我记录了连接时尝试使用的参数:

file_put_contents('debug.txt', 'drive options: ' . json_encode($driverOptions) , FILE_APPEND);

我看到了正确的选择。至少我们没有注意到它们中的错误。如果它们不正确,那么如果我在before()函数中注释掉所有测试都会失败,因为它们也会连接到数据库。

我们正在使用docker容器。我尝试使用任意随机字符串作为用户名登录mysql来检查:

mysql -u randomstr 

它与我写的任何东西连接为-u参数。所以我不知道如何检查我的连接数据是否正确。

顺便说一句,我不知道我在做什么之前在做什么,同事只是说要用

https://github.com/doctrine/data-fixtures

用于删除记录,因此我试图让一些代码运行。

如果你知道更好的方法,你也可以说。

运行test时错误如下:

--- Failed hooks:

    BeforeScenario # tests\ApiBundle\features\group_management\bootstrap\CreatingNewGroupContext::before()
      │ before
      An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused (Doctrine\DBAL\Exception\ConnectionException)

1 个答案:

答案 0 :(得分:0)

第一件事:需要在behat文件中添加参数到docker run脚本:

--net=host

正在运行其他数据库查询,因为它使用不同的docker容器,并且在该容器的docker中运行此参数已存在。

这是来自behat shell脚本文件:

docker run --rm --sig-proxy=false --net=host -v ${APP_SRC_PATH}:${APP_DST_PATH} $APP_IMAGE bin/behat $@

之前()函数:

/**
 * @BeforeScenario
 * @throws \Doctrine\DBAL\DBALException
 * @return null
 */
public function before()
{
    $stmt = $this->entityManager->getConnection()
        ->prepare("DELETE FROM `group` WHERE name = 'New group'");
    $stmt->execute();
}

实体经理是这样的:

use Doctrine\ORM\EntityManager;