Создать тест сущности для пакета symfony2, у которого нет сущностей: класс не был найден в пространствах имен, сконфигурированных цепочкой

Мы создали пакет для интеграции CartoDB в проекты Symfony2. Этот пакет не создает саму сущность, потому что он "прослушивает" такие события, как сохранение или сброс ваших собственных сущностей, чтобы синхронизировать информацию между вашими данными и данными cartodb. Вот рабочий процесс:
Создать объект сущности -> сохранить -> прослушать событие -> добавить данные в cartoDB через их API -> получить идентификатор объекта cartoDB -> обновить его в созданном объекте
Вот пример для аннотаций CartoDB Bundle:

/**
 * @ORM\Entity
 * @ORM\Table(name="testDB", options={"collate"="utf8_general_ci"})
 * @CartoDB\CartoDBLink(connection="private", table="testDB", cascade={"persist", "remove"})
 */

class TestDB
{
/**
* @ORM\Column(name="cartodb_index", type="integer", nullable=true)
* @CartoDB\CartoDBColumn(column="testdb_id", index=true)
*/
protected $cartodbId;  

Мы хотели бы создать тесты, которые охватывают любую часть кода, поэтому мы решили включить Entity в тестовую папку для тестирования синхронизации с данными cartoDB и добавить ее в тестовую папку, выполнив следующие действия:
1- Добавьте Doctrine Bundle в наш комплект composer.json.
2- Создайте класс сущности в этом маршруте:

Company/Tests/CartoDB/Entity/TestDB.php  

Эта сущность выглядит так:

namespace Company\CartoDBBundle\Tests\CartoDB\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table(name="testDB", options={"collate"="utf8_general_ci"})
* @CartoDB\CartoDBLink(connection="private", table="testDB", cascade={"persist", "remove"})
*/

class TestDB
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;
.....
?>

3. Теперь очередь за тестовым скриптом. Мы используем пространство имен сущности:

use Company\CartoDBBundle\Tests\CartoDB\Entity\TestDB;  

Далее мы создаем объект сущности:

$test = new TestDB();  
$test->setText("HI");  

Он работает нормально, мы вызываем методы объектов, и все идет правильно, и последний проход:

$em->persist($test);
$em->flush();  

Doctrine \ Common \ Persistence \ Mapping \ MappingException: класс 'Company\CartoDBBundle\Tests\CartoDB\Entity\TestDB' не найден в пространствах имен, сконфигурированных для цепочки
Вот наша конфигурация доктрины:

doctrine:  
dbal:  
  driver: pdo_sqlite  
  path: "%kernel.root_dir%/sqlite.db"  
  charset: UTF8  
orm:  
  auto_generate_proxy_classes: %kernel.debug%  
  auto_mapping: true  

Не знаете, чего нам не хватает, кто-нибудь может нам помочь?
Спасибо!

1 ответ

Решение

Основная проблема в том, что по умолчанию Doctrine смотрит только в каталог Bundle/Entity. Так что вам нужно немного больше информации в orm: в вашем файле конфигурации.

В руководстве есть больше деталей: http://symfony.com/doc/current/reference/configuration/doctrine.html

doctrine:
orm:
    auto_generate_proxy_classes: %kernel.debug%
    auto_mapping: false
    mappings:
        name:
            type: php
            dir: %kernel.root_dir%/../src/Company/CartoDBBundle/Tests/CartoDB/Entity
          # alias: MyModels
          # prefix: MyBundle\OtherNamespacePart\Entity
          # is_bundle: true

Вам может понадобиться или нет необходимость использовать псевдоним и префикс. Когда он правильно настроен, тогда выполняется:

app/console doctrine:schema:update --dump-sql 

Будет сбрасывать информацию таблицы.

Другие вопросы по тегам