2010-03-25 9 views
7

En los Aparatos documentación relativa (http://api.rubyonrails.org/classes/Fixtures.html) que proporcionan el siguiente ejemplo del uso de las referencias de etiquetas para las asociaciones:En una prueba unitaria de Rails, ¿cómo puedo obtener un accesorio de usuario para cargar su perfil asociado?

### in pirates.yml 
reginald: 
    name: Reginald the Pirate 
    monkey: george 

### in monkeys.yml 
george: 
    name: George the Monkey 
    pirate: reginald 

Así pues, siguiendo su ejemplo, que tienen un modelo de usuario que has_one: perfil, un modelo de perfil que belongs_to: usuario, y tratado de establecer los accesorios por su ejemplo:

### in users.yml 
reginald: 
    id: 1 
    login: reginald 

### in profiles.yml 
reginalds_profile: 
    id: 1 
    name: Reginald the Pirate 
    user: reginald 

(Nota: ya que mi asociación es de un solo sentido, el dispositivo de usuario no tiene un "perfil: reginalds_profile" asociación - poniéndolo en causas un error porque la tabla SQL no tiene ningún atributo profile_id).

El problema es que, en las pruebas de mi unidad, todo parece cargarse correctamente, pero los usuarios (: reginald) .profile siempre son nulos. ¿Qué me estoy perdiendo?

+0

Creo que podría haberlo averiguado mediante prueba y error ... pero aún me gustaría ver si alguien puede verificar lo que estaba haciendo mal. No es partidario de las soluciones de prueba y error. – MikeJ

+0

¿qué hiciste para arreglarlo? – cbrulak

+0

Observé en mi ejemplo que la principal diferencia es que configuré las identificaciones de las luminarias en lugar de dejar que Rails las configurara (antiguo hábito, usar Rails desde 1.x). Cuando saqué los ID funcionó, pero ¿por qué? – MikeJ

Respuesta

18

Sobre la base de la sugerencia de Tadman he hecho un poco más la búsqueda y encontré la respuesta en otra parte de este sitio, así que también podría publicarlo.

Ver post titulado Automatic associations in ruby on rails fixtures

Al parecer, la forma en rieles hallazgos accesorios asociados cuando se utiliza etiquetas (usuario: Reginald) en vez de la identificación (user_id: 1) es por hashing el nombre y asumiendo el hash es el ID . Si configura la ID a algo específico, esto falla. Pero si dejas que Rails asigne identificadores automáticamente, usa ese esquema de hash. Por lo tanto, a la documentación de las etiquetas de asociación de luminarias le falta un tidbit clave: si usa etiquetas, debe evitar aplicar sus propios ID en los accesorios que se emparejarán. Los accesorios que no coinciden con las etiquetas aún pueden tener el esquema de identificación que elijas.

+0

Gracias por hacer la investigación aquí. No estaba seguro ya que trato de no mezclar y combinar estilos. – tadman

2

Deberá declarar que está cargando todos estos dispositivos, ya que no creo que el cargador de dispositivos siga asociaciones como esta automáticamente. En algunos casos puede que tenga que hacer algo más que simplemente:

fixtures :all 

En realidad declarando cada uno de ellos:

fixtures :users, :profiles 
+0

Creo que es el caso de las pruebas de integración, pero para las pruebas unitarias parece que está cargando todos mis dispositivos, simplemente no hace la asociación. Traté de hacerlos explícitos y el mismo problema. – MikeJ

+0

La otra cosa a tener en cuenta es si la asignación manual de valores de ID entra en conflicto con la función de asignación automática de referencias cruzadas. – tadman

+1

Hice un poco más de búsqueda y estás en lo correcto ... mira a continuación. – MikeJ

Cuestiones relacionadas