Rails: Fabbriche e Associazioni nei test funzionali
-
21-09-2019 - |
Domanda
Sto cercando di capire perché questo non funziona.
Diciamo che tre modelli, l'utente, Foo e Bar. Al fine di un bar per creare l'utente deve prima creare e validare un oggetto 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
Sto cercando di ottenere un test funzionale di lavoro in cui, se l'utente tenta di fare un nuovo bar senza avere un foo valida, ottengono reindirizzato all'azione "nuovo" per un Foo.
Non ho avuto alcun problema con lo scenario di reindirizzamento. Tuttavia, quando si tenta di impostare un utente con un oggetto Foo valida e cercare di ottenere l'azione "nuovo" per un bar, ancora viene rediretto all'azione "nuovo" del regolatore Foo. Si continua a non riconoscere che l'utente ha una Foo.
Ecco il mio controllo:
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
Questa è la funzione di reindirizzamento che ho nel mio controller applicazione che si chiama nel mio controller bar:
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
Ecco il Foo di fabbrica:
Factory.define :foo do |f|
#attributes
f.valid true
f.association :user
end
Invece vengo reindirizzato a " https://test.host:80/foos/new" il controller non riconoscere che l'utente ha un Foo ...
La sessione è valida quindi questo mi sembra un problema di fabbrica, ma non sono sicuro di cosa sia.
Soluzione
sto supponendo che questo è factory_girl. Si chiama Factory.build
che non salva nulla al database, in modo da non avere il valore di chiave esterna necessaria per la vostra associazione. Passare a quelli Factory.create
e si dovrebbe vedere la differenza.