web-dev-qa-db-fra.com

Rails / Rspec - test d'une redirection dans le contrôleur

J'écris donc actuellement un test pour un contrôleur dans un contrôleur existant qui n'en avait tout simplement pas auparavant. Ce que je veux tester, c'est une redirection qui se produit lorsque quelqu'un n'est pas autorisé à modifier quelque chose vs quelqu'un qui est autorisé à le modifier.

l'action du contrôleur en cours de modification

def edit
  if [email protected]? || admin?
    @company = @scorecard.company
    @custom_css_include = "confirmation_page"
  else
    redirect_to :back
  end
end

Donc, si un tableau de bord a été examiné, seul un administrateur peut modifier ce score. Les routes pour ce contrôleur ..

# scorecards
resources :scorecards do
  member do
    get 'report'
  end
  resources :inaccuracy_reports, :only => [:new, :create]
end

et enfin le test

  require 'spec_helper'

  describe ScorecardsController do

    describe "GET edit" do
      before(:each) do
        @agency = Factory(:agency)
        @va = Factory(:va_user, :agency => @agency)
        @admin = Factory(:admin)
        @company = Factory(:company)
        @scorecard = Factory(:scorecard, :level => 1, :company => @company, :agency => @agency, :reviewed => true)
        request.env["HTTP_REFERER"] = "/scorecard"
      end

      context "as a admin" do
        before(:each) do
          controller.stub(:current_user).and_return @admin
        end

        it "allows you to edit a reviewed scorecard" do
          get 'edit', :id => @scorecard.id
          response.status.should be(200)
        end
      end

      context "as a va_user" do
        before(:each) do
        controller.stub(:current_user).and_return @va
      end

      it "does not allow you to edit a reviewed scorecard" do
        get 'edit', :id => @scorecard.id
        response.should redirect_to :back
      end
    end
  end
end

donc un va en essayant de modifier un score évalué sera redirigé vers l'arrière, où un administrateur ne le fera pas.

mais en exécutant cela via rspec je reçois

ScorecardsController
  GET edit
    as a admin
      allows you to edit a reviewed scorecard
    as a va_user
      does not allow you to edit a reviewed scorecard (FAILED - 1)

Failures:

  1) ScorecardsController GET edit as a va_user does not allow you to edit a reviewed scorecard
     Failure/Error: response.should redirect_to :back
   Expected response to be a redirect to </scorecard> but was a redirect to <http://test.Host/>
     # ./spec/controllers/scorecards_controller_spec.rb:33:in `block (4 levels) in <top (required)>'

Finished in 0.48517 seconds
2 examples, 1 failure

donc je ne sais pas si ça marche ou pas depuis que j'ai défini le request.env["HTTP_REFERER"] = "/scorecard" comme l'endroit qui devrait être le :back comme où. ou ai-je raté l'idée en regardant httpstatus il y a les 300 réponses que je pourrais utiliser mais je ne saurais pas par où commencer?

toute aide serait géniale

MODIFIER

Je pourrais le tester en le faisant comme ça

...
response.status.should be(302)

mais j'ai eu l'idée de ceci question et il semble que cela pourrait être puissant car il spécifie l'url redirigée vers.

Quelqu'un a un test de travail comme celui-ci?

58
TheLegend

Cette ligne a un problème

response.should redirect_to :back

La logique n'est pas correcte. Vous devez vous attendre #edit pour rediriger vers :back chemin que vous avez défini auparavant, qui est /scorecard. Mais vous définissez :back ici. Dans le cadre de Rspec, :back doit être vide dans chaque exemple.

Pour réviser, il suffit de le définir comme

response.should redirect_to '/scorecard'
45
Billy Chan

Pour rendre le test plus lisible, vous pouvez le faire: (rspec ~> 3.0)

expect(response).to redirect_to(action_path)
63
Mugur 'Bud' Chirica

Pour tester si des redirections se sont produites, sans itinéraire correspondant

(juste pour tester la redirection, je l'ai utilisé lorsque l'itinéraire est trop long: D). Vous pouvez simplement faire comme:

expect(response.status).to eq(302) #redirected
1
aldrien.h