1

J'essaie de comprendre pourquoi cela ne fonctionne pas.Rails: usines et associations dans les tests fonctionnels

Disons trois modèles, User, Foo et Bar. Pour qu'une barre soit créée, l'utilisateur doit d'abord créer et valider un objet foo.

Class User #snip! 
has_many :foos 
has_many :bars 

Class Foo #snip! 
belongs_to :user 
has_many :bars 

Class Bar #snip! 
belongs_to :user 
belongs_to :foo 

J'essaie d'obtenir un test fonctionnel de travail où si l'utilisateur tente de faire un nouveau bar sans avoir une foo valide, ils sont redirigés à l'action « nouveau » pour un Foo.

Je n'ai eu aucun problème avec le scénario de redirection. Toutefois, lorsque j'essaie de configurer un utilisateur avec un objet Foo valide et que j'essaie d'obtenir la "nouvelle" action pour une barre, elle est toujours redirigée vers la "nouvelle" action du contrôleur Foo. Il ne reconnaît toujours pas que l'utilisateur a un Foo.

Voici mon contrôleur:

class BarsControllerTest < ActionController::TestCase 
    setup :activate_authlogic 
    def setup 
    @request.env['HTTPS'] = nil 
    @user = Factory.build(:user) 
    @foo = Factory.build(:foo, :user => @user) 
    end 
    test "should get new when user has a valid foo" do 
    @request.env['HTTPS'] = 'on' 
    UserSession.create(@user) 
    get :new 
    assert_response :success 
    end 

Ceci est la fonction de redirection que j'ai dans mon contrôleur d'application qui est appelé dans mon contrôleur de barre:

def foo_required 
    if current_user && @current_user.foos.valid.empty? && @current_user.foos.empty? 
    flash[:notice] = "You must have a verified foo in order to create a Bar!" 
    redirect_to new_foo_path 
    elsif current_user && @current_user.foos.valid.empty? 
    flash[:notice] = "You must verify your foos in order to create a Bar!" 
    redirect_to foos_path 
    end 
end 

est ici Foo usine:

Factory.define :foo do |f| 
    #attributes 
    f.valid true 
    f.association :user 
end 

Au lieu de cela, je suis redirigé vers "https://test.host:80/foos/new" Le contrôleur n'a pas de reconnaissez que l'utilisateur a un Foo ...

La session est valide donc cela semble être un problème d'usine, mais je ne suis pas sûr de ce que c'est. Je suppose que c'est factory_girl.

Répondre

3

Vous appelez Factory.build ce qui ne sauvegarde rien dans la base de données, donc vous n'avez jamais la valeur de clé étrangère nécessaire pour votre association. Passez à Factory.create et vous devriez voir une différence.

+0

Bien sûr, il devait être quelque chose de simple comme ça! * frappe la tête * Merci beaucoup jdl, tu m'as sauvé un jour de tiraillement! –

+0

De rien. – jdl

Questions connexes