2010-10-13 14 views
0

Je cours des rails 3.0, rspec 2.0 et factory_girl. Voici le scénario simplifié, je travaille avec: un utilisateur peut souscrire à un seul plan à la foisproblème avec factory_girl, rpsec 2.0 et rails 3.0 => impossible d'obtenir has_one relation travaillant bien ensemble!

# user.rb 
class User < ActiveRecord::Base 
    has_one :plan 
    attr_accessible :login, :plan_id 

end 

# plan.rb 
class Profile < ActiveRecord::Base 
attr_accessible :plan 
end 

# user_factory.rb 
Factory.define :user do |u| 
    u.login "test" 
    u.association :plan 
end 

#plan_factory.rb 
Factory.define :plan do |p| 
    p.name "plan1" 
end 

quand je lance spec rspec/modèles/user_spec.rb Je suis cette erreur:

panne/erreur: user = usine (: user) SQLite3 :: ConstraintException: users.plan_id ne peut pas être NULL

#spec/models/user_spec.rb 
require File.dirname(__FILE__) + '/../spec_helper' 

describe User do 
    it "should be valid" do 
    user = Factory(:user) 
    #User.new.should be_valid 
    user.should be_valid 
    end 
end 

ce que je fais mal? Je suis coincé avec ce scénario très simple, et c'est très frustrant. à ce moment BDD me ralentir comme l'enfer!

+0

avez-vous construit votre db de test? 'rake db: test: préparer' – Trip

Répondre

0

Un utilisateur s'abonne à un plan. donc un utilisateur a un plan et un plan est lié à de nombreux utilisateurs. Donc je pense que j'ai bien compris. l'erreur était dans l'usine de l'utilisateur. remplaçant

u.association :plan 

par

u.association :plan, :factory => :plan 

résolu le problème.

Problème résolu!

0

Il semblerait que vous ayez implémenté l'association has_one de manière incorrecte. La clé étrangère dans une relation has_one -- belongs_to doit aller dans la table correspondant au modèle avec la directive belongs_to. Check db/schema.rb - Je pense que vous trouverez que plan_id est défini dans le tableau users. Si vous voulez que le modèle User ait un Plan, vous devez supprimer plan_id de users et ajouter user_id à plans.

Si vous préférez faire en sorte un Plan a un User, garder le schéma tel qu'il est et mettre has_one :user dans Plan et belongs_to :plan dans User.