当我不尝试清理数据库时,一切正常 - 测试可以连接到数据库。
部分测试是:
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)
答案 0 :(得分:0)
第一件事:需要在behat文件中添加参数到docker run脚本:
--net=host
正在运行其他数据库查询,因为它使用不同的docker容器,并且在该容器的docker中运行此参数已存在。
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;