Come testare correttamente questa azione del controller con Shoulda?
-
19-08-2019 - |
Domanda
Ho la seguente azione e test del controller. Sono nuovo ai test con Shoulda e so ci sono aree del mio controller che posso testare ulteriormente. Ad esempio, i miei messaggi flash e la verifica dei rendering.
Quindi la mia domanda è: come testerei correttamente questa azione del controller in Shoulda?
L'azione del mio controller (i nomi sono stati cambiati per proteggere gli innocenti):
def my_action
return redirect_to(root_url) if @site.nil?
@owner = current_site.owner
if request.post?
if params[:password].blank? || params[:email].blank?
flash[:error] = "You must fill in both the e-mail and password fields"
render :action => "my_action"
else
if @owner.authenticated?(params[:password])
@owner.login = params[:email]
@owner.save!
@owner.do_some_method
flash[:success] = "Success."
render :action => "my_action"
else
flash[:error] = "Incorrect password"
render :action => "my_action"
end
end
end
end
Il mio test:
context "on POST to :my_action" do
setup do
Owner.any_instance().expects(:do_some_method)
post :my_action, :email => 'foo@bar.com', :password => 'test'
end
should_assign_to :owner
should "Change name and verify password and resend activation key" do
assert_equal true, assigns(:owner).authenticated?('test')
assert_equal 'foo@bar.com', assigns(:owner).login
end
should_respond_with :success
end
Soluzione
In questo momento, sembra che tu stia testando funzionalità specifiche del modello all'interno del tuo controller, che dovrebbe essere in un unit test.
Consiglio di riconsiderare il controller affinché includa la logica richiesta per l'aggiornamento dell'e-mail del proprietario all'interno del modello del proprietario. In questo modo, dovresti essere in grado di semplificare il controller fino a un semplice se aggiorna; altro; fine
e semplifica notevolmente il test del controller. Dopo aver spostato la logica nel modello, è possibile utilizzare le convalide Rails integrate.
Un paio di altre cose da considerare:
- Il reindirizzamento dopo il completamento dell'azione POST impedisce all'utente di effettuare la doppia pubblicazione per errore (la maggior parte dei browser si lamenterà quando l'utente la tenta).
- Sposta il controllo per @site e anche l'assegnazione a @owner in
before_filters
se ciò viene fatto più di una volta all'interno del controller. - Puoi evitare di selezionare
if request.post?
converifica
o creando una rotta in `config / route.rb '.
Riferimenti :