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
È stato utile?

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? con verifica o creando una rotta in `config / route.rb '.

Riferimenti :

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top