2010-03-25 9 views
7

nella documentazione concernente Fixtures (http://api.rubyonrails.org/classes/Fixtures.html) forniscono il seguente esempio di utilizzo di riferimenti di etichetta per le associazioni:In un test dell'unità Rails, come posso ottenere un dispositivo Utente per caricare il suo profilo associato?

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

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

Quindi seguendo il loro esempio, ho un modello User che has_one: profilo, un modello di profilo che belongs_to: utenti, e ha cercato di creare dispositivi per il loro esempio:

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

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

(Nota: dal momento che la mia associazione è a senso unico, l'apparecchio utente non dispone di un "profilo: reginalds_profile" associazione - mettendolo in cause un errore perché la tabella SQL non ha attributo profile_id.)

Il problema è che, nei miei test di unità, tutto sembra essere caricato correttamente, ma gli utenti (: reginald) .profile sono sempre nulli. Cosa mi manca?

+0

Penso che avrei potuto capirlo attraverso prove ed errori ... ma mi piacerebbe ancora vedere se qualcuno può verificare cosa stavo facendo male. Non è un fan delle soluzioni trial-and-error. – MikeJ

+0

cosa hai fatto per sistemarlo? – cbrulak

+0

Ho notato nel mio esempio che la differenza principale è che ho impostato io stesso gli ID delle fixture invece di lasciare che Rails li abbia impostati (vecchia abitudine, utilizzo Rails dal 1.x). Quando ho preso gli ID ha funzionato, ma perché? – MikeJ

risposta

18

Basato su suggerimento di Tadman ho fatto un po 'di più la ricerca e trovato la risposta altrove in questo sito, quindi potrei anche pubblicarlo.

vedi post intitolato Automatic associations in ruby on rails fixtures

A quanto pare il modo in Rails reperti associati infissi quando si utilizza etichette (utente: Reginald) al posto di ID (user_id: 1) è di hashing il nome e supponendo che l'hash è l'ID . Se si imposta l'ID su qualcosa di specifico, questo fallisce. Ma se lasci che Rails assegni automaticamente gli ID, usa lo schema di hashing. Quindi la documentazione per le etichette dell'associazione di dispositivi manca di un bocconcino di chiavi: se si utilizzano etichette, è necessario evitare di applicare i propri ID nei dispositivi da abbinare. Le fixture che non vengono confrontate con le etichette possono comunque avere qualsiasi schema ID scelto.

+0

Grazie per la ricerca qui. Non lo sapevo per certo, perché cerco di non mescolare e abbinare stili. – tadman

2

Potrebbe essere necessario dichiarare che si stanno caricando tutti questi proiettori poiché non credo che il caricatore di dispositivi segua automaticamente associazioni come questa. In alcuni casi potrebbe essere necessario fare di più che semplicemente:

fixtures :all 

realtà dichiarando ognuno di loro:

fixtures :users, :profiles 
+0

Penso che sia il caso dei test di integrazione, ma per i test unitari sembra che stia caricando tutti i miei dispositivi, semplicemente non facendo l'associazione. Ho provato a renderli espliciti e lo stesso problema. – MikeJ

+0

L'altra cosa da considerare è se l'assegnazione di valori ID è in conflitto con la funzione di auto-assegnazione, cross-referencing. – tadman

+1

Ho fatto qualche ricerca in più e tu hai ragione ... vedi sotto. – MikeJ

Problemi correlati