I am writing new Behat test. New context from scratch.
Scenario: user visualization
Given database is empty
Class "AppBundle\Entity\User" sub class of "FOS\UserBundle\Model\User" is not a valid entity or mapped super class. (Doctrine\ORM\Mapping\MappingException)
The step is the following:
/** @Given database is empty */
public function databaseIsEmpty()
{
$this->manager->createQuery('delete from AppBundle\Entity\User')->execute();
}
And the context implements KernelAwareContext that allow context to load kernel and thus also doctrine.
class Context implements BehatContext, KernelAwareContext
{
private $kernel;
public function setKernel(KernelInterface $kernel)
{
$this->kernel = $kernel;
$this->client = new \GuzzleHttp\Client([
'base_uri' => 'http://localhost:8001',
]);
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__ . "/../../AppBundle/Entity"), true);
$conn = array('driver' => 'pdo_sqlite', 'path' => __DIR__ . '/../../../data/data.sqlite',);
$this->manager = EntityManager::create($conn, $config);
}
but ...
When $this->manager->createQuery('delete from AppBundle\Entity\User')->execute();
is called, returns the error Class "AppBundle\Entity\User" sub class of "FOS\UserBundle\Model\User" is not a valid entity or mapped super class.
Same query, is executed in unit tests. The only difference here is that in unit tests is loaded in this way:
public function setUp()
{
$this->client = static::createClient();
self::bootKernel();
$this->container = self::$kernel->getContainer();
$this->manager = $this->container->get('doctrine.orm.entity_manager');
$this->manager->createQuery('delete from AppBundle\Entity\User')->execute();
}
If you have a problem with your entity mappings, setup etc. first you need to sort it out. I give you fully working example so you need to work with it. First one purges every single table in database whereas the second one purges only single table.
PURGE WHOLE DATABASE
use Behat\MinkExtension\Context\MinkContext;
use Behat\Symfony2Extension\Context\KernelAwareContext;
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Symfony\Component\HttpKernel\KernelInterface;
class FeatureContext extends MinkContext implements KernelAwareContext
{
/** @var KernelInterface */
private $kernel;
public function setKernel(KernelInterface $kernel)
{
$this->kernel = $kernel;
}
/**
* @Given /^the database is empty$/
*/
public function theDatabaseIsEmpty()
{
$container = $this->kernel->getContainer();
$entityManager = $container->get('doctrine.orm.entity_manager');
$purger = new ORMPurger();
$purger->setPurgeMode(ORMPurger::PURGE_MODE_TRUNCATE);
$executor = new ORMExecutor($entityManager, $purger);
$executor->execute([]);
}
}
CLEAR SINGLE ENTITY
/**
* @Given /^there is no user in database$/
*/
public function thereIsNoUserInDatabase()
{
$container = $this->kernel->getContainer();
$entityManager = $container->get('doctrine.orm.entity_manager');
// AppBundle\Entity\User.php
$entityManager->createQuery('DELETE FROM AppBundle:User')->execute();
}
Plenty of examples for you: http://www.inanzzz.com/index.php/posts/behat