Duda con Fixtures

62 views
Skip to first unread message

Richard Perez

unread,
May 3, 2012, 4:43:00 PM5/3/12
to symfo...@googlegroups.com
Hola a todos, tengo una duda con unas fixtures que comparten objetos,

Tengo una primera fixture que carga lo que son las "Áreas de Conocimiento" ( he cambiado un poco el código para simplificarlo, pero creo que la idea se mantiene )

        $areasConocimientos = new AreasConocimientos();
    $areasConocimientos->setAreaConocimiento('Diseño');
    $manager->persist ($areasConocimientos);
    $this->addReference( 'Diseño',  $areasConocimientos);

    $areasConocimientos = new AreasConocimientos();
    $areasConocimientos->setAreaConocimiento('Programacion');
    $manager->persist ($areasConocimientos);
    $this->addReference( 'Programacion',  $areasConocimientos);

        $areasConocimientos = new AreasConocimientos();
    $areasConocimientos->setAreaConocimiento('Otro');
    $manager->persist ($areasConocimientos);
    $this->addReference( 'Otro',  $areasConocimientos);

    $manager->flush();

       
Ahora en una segunda fixture (getOrder = 2)

$areaConocimiento= array(
                         'Diseño' => array( 'Diseño 1', 'Diseño 2' ),
                         'Programación' => array( 'Programacion 1', 'Programacion'), 
                         'Otro' => array( 'Otro 1', 'Otro 2' )
                        );
foreach( $areaConocimiento as $area => $programas ){
                
                foreach( $programas as $programa ){

                    //El objeto programa ProgramasEstudios tiene un Id, un campo string y una Relacion ManyToOne con AreasConocimientos
                    $objProgramasEstudios = new ProgramasEstudios();
                    $objProgramasEstudios->setProgramasEstudios( $programa );
                    $objProgramasEstudios->setAreaConocimiento( $manager->merge( $this->getReference($area) ) );
                    $manager->persist( $objProgramasEstudios );           
        
                }
}

 $manager->flush();

Si ejecuto el comando para cargar las fixtures todo funciona sin problemas al haber usado $this->addReference()... luego puedo llamarla $this->getReference($area), el problema esta en que quiero usar los "programas de estudios" como referencia para otra fixture que necesito, así que agrego esta línea
            
$this->addReference( $programa, $objProgramasEstudios);// debajo de  $manager->persist( $objProgramasEstudios ); 


Cuando hago esto y trato cargar las fixtures obtengo el siguiente error:

[BadMethodCallException]  
  Reference to: (Diseño ) already exists, use method setReference in order to override it

Supongo  (es a la conclusión que he llegado) que al crear la referencia del $objProgramasEstudios, como este a su vez contiene un objeto de tipo AreasConocimiento trata de crear una referencia de la misma tambien, pero como ya existe una (cuando se crearon en el primer fixture) da un error, si uso el metodo setReference como lo indica obtengo otro error $objProgramasEstudios->setAreaConocimiento( $manager->merge( $this->getReference($area) ) ); indicando que no estoy pasando un objeto de tipo AreaConocimiento sino uno Proxies\EstudiosBundleEntityProgramasEstudiosProxy

Alguien que me pueda ayudar :D

Richard Perez

unread,
May 4, 2012, 4:09:15 PM5/4/12
to symfo...@googlegroups.com
Alguien que tenga una idea?

Xavi Montero

unread,
May 4, 2012, 4:52:37 PM5/4/12
to symfo...@googlegroups.com
Hola,

Estoy pasando tests a mi proyecto y si testeo un único Bundle perfecto, pero si testeo todo en general, parece que se "acumulan" los consumos de memoria.

Como el server de pruebas en cuestión tiene 512MB de RAM, al pasar el test "completo" me peta la máquina.

==========================
xavi@bromo$ phpunit -c app/ src/FrontEnd/FeedbackBundle/
[...]
Time: 8 seconds, Memory: 103.00Mb
OK (3 tests, 27 assertions)
xavi@bromo$
==========================
xavi@bromo$ phpunit -c app/ src/FrontEnd/
[...]
Time: 01:51, Memory: 508.75Mb
OK (24 tests, 420 assertions)
---> Debería devolver el control al shell y se queda clavado por falta de memoria
==========================

¿Alguien tiene alguna pista sobre cómo optimizar los recursos durante el test o al menos "monitorizar" quién genera los leaks (si soy yo o es el phpunit)?

Saludos!
Xavi.

proclamo

unread,
May 4, 2012, 6:52:31 PM5/4/12
to symfo...@googlegroups.com
¿Tienes en cuenta el orden en que se cargan los fixtures? Me suena haber tenido problemas similares por no haberlo establecido. Ahora de memoria no recuerdo cómo se establecía el orden, no se si había un método getOrder() o era una annotation.

Richard Perez

unread,
May 5, 2012, 12:17:07 AM5/5/12
to symfo...@googlegroups.com
Si si tengo en cuenta el orden... de hecho ese es el método getOrder(), pero no se trata del orden. Mañana publico una forma mas sencilla de explicarlo a ver si alguien tiene una solucion :D.

Carlos Zuniga

unread,
May 5, 2012, 1:11:09 AM5/5/12
to symfo...@googlegroups.com
2012/5/3 Richard Perez <rich...@gmail.com>:
Lo raro es que el error dice "Diseño " en lugar de "Diseño 1" u otro.
Seguro que no es un error de tipeo en algún fixture?

Internamente setReference simplemente añade el objeto a un array con
la referencia como clave así que no creo que sea algún error de
referencia cruzada.

Saludos
--
Linux Registered User # 386081
A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos
de leer manuales.

Richard R. Perez Q.

unread,
May 7, 2012, 10:20:37 AM5/7/12
to symfo...@googlegroups.com
No, no es error de tipeo :S... A mi tambien me parecia raro que dijera "Diseño" en lugar de "Diseño 1", por lo que llegue a esa conclusión que al agregar el objeto "ProgramasEstudios" como este a su vez contiene un objecto "AreaConocimiento" trata de agregar la referencia de este último también, la cual si ya fue agregada... y quizás también por eso al user setReference, lo cual sobreescribe una referencia entonces obtengo luego error en setAreaconocimiento, pero todo esto lo asumo según lo que veo, esperaba que alguien me dijera si era asi, si me equivocaba o si hay alguna otra solución, en realidad se me ocurre una, pero no es muy elegante entonces quiero escuchar opiniones

Gracias a todos por sus respuestas

2012/5/5 Carlos Zuniga <carlo...@gmail.com>

--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es



--
Atte.
Richard R. Perez Q.

Richard R. Perez Q.

unread,
May 7, 2012, 10:42:53 AM5/7/12
to symfo...@googlegroups.com
Disculpen Todos ya encontré el error y bueno lo que estaba asumiendo era incorrecto, me parecía algo extraño, pero era lo único que se me ocurría, como les dije trate de resumir el código para hacerlo más legible, pero ahi fue donde estaba el problema que no vieron mi error real :p

$areaConocimiento= array(
                         'Diseño' => array( 'Diseño 1', 'Diseño 2' ),
                         'Programación' => array( 'Programacion 1', 'Programacion'), 
                         'Otro' => array( 'Otro 1', 'Otro 2' )
                        );

El error estaba es que dentro de las areas de conocimiento (Diseño, Programación, Otros) habían otras mas y no me había fijado que una de ellas tenía también como programa de estudios 'Diseño', entonces tenia una Area de Conocimiento y un programa de estudios que se llamaban igual.

Nuevamente Gracias a Todos


2012/5/7 Richard R. Perez Q. <rich...@gmail.com>

Marcos José Pérez Pérez

unread,
May 7, 2012, 11:37:33 AM5/7/12
to symfo...@googlegroups.com

areasDeConocomiento lo estas declarabdo 3 veces con el.mismo nombre tu identificador debe ser diferente...

--
Reply all
Reply to author
Forward
0 new messages