Rails: usines et associations dans les tests fonctionnels
-
21-09-2019 - |
Question
Je suis en train de comprendre pourquoi cela ne fonctionne pas.
Disons que vous trois modèles, l'utilisateur, Foo et Bar. Pour un bar à créer 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
Je suis en train 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 vers l'action « nouveau » pour un Foo.
Je n'ai pas eu de problème avec le scénario de redirection. Cependant, lorsque je tente de configurer un utilisateur avec un objet Foo valide et essayer d'obtenir l'action « nouveau » pour une barre, il obtient toujours redirigé vers l'action « nouveau » du contrôleur Foo. Il ne reconnaît pas encore 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
Voici la Foo usine:
Factory.define :foo do |f|
#attributes
f.valid true
f.association :user
end
Au lieu de cela, je redirigés vers « https://test.host:80/foos/new » le contrôleur ne reconnaît pas que l'utilisateur a un Foo ...
La session est valide si cela semble être un problème d'usine, mais je ne suis pas sûr de ce qu'il est.
La solution
Je suppose que cela est factory_girl. Vous appelez Factory.build
qui ne sauve rien à la base de données, de sorte que vous n'avez la valeur de clé étrangère nécessaire pour votre association. Mettez ceux Factory.create
et vous devriez voir une différence.