Class "AppBundle\Entity\User" "FOS\UserBundle\Model\User" 的子 class 不是有效实体或映射的超 class

Class "AppBundle\Entity\User" sub class of "FOS\UserBundle\Model\User" is not a valid entity or mapped super class

我正在编写新的 Behat 测试。从头开始的新上下文。

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)

步骤如下:

/** @Given database is empty */
public function databaseIsEmpty()
{
    $this->manager->createQuery('delete from AppBundle\Entity\User')->execute();
}

并且上下文实现了 KernelAwareContext,它允许上下文加载内核,从而也允许学说。

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);
    }

但是...

调用$this->manager->createQuery('delete from AppBundle\Entity\User')->execute();时,returns报错Class "AppBundle\Entity\User" sub class of "FOS\UserBundle\Model\User" is not a valid entity or mapped super class.

相同的查询,在单元测试中执行。这里唯一的区别是在单元测试中以这种方式加载:

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();
}

如果您的实体映射、设置等方面存在问题,您首先需要将其解决。我为您提供了完整的示例,因此您需要使用它。第一个清除数据库中的每个 table 而第二个只清除单个 table.

清除整个数据库

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([]);
    }
}

清除单个实体

/**
 * @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();
}

大量示例供您参考:http://www.inanzzz.com/index.php/posts/behat