Rails/Rspec – een omleiding testen in de controller

Dus ik ben momenteel een test aan het schrijven voor een controller in een bestaande controller die er eerder geen had. Wat ik wil testen is een omleiding die plaatsvindt wanneer iemand iets niet mag bewerken versus iemand die het wel mag bewerken.

de controlleractie die wordt bewerkt

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

Dus als een scorekaart is beoordeeld, kan alleen een beheerder die score bewerken.
De routes voor die controller..

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

en tot slot de 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

dus een va wanneer u een beoordeelde score probeert te bewerken, wordt teruggestuurd, waar een beheerder dat niet doet.

maar als ik dit door rspec laat lopen, krijg ik

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

dus ik weet niet of het werkt of niet, aangezien ik de request.env["HTTP_REFERER"] = "/scorecard"heb ingesteld als de plaats die de :backzoals het waar is. of mis ik het idee helemaal als ik naar httpstatuskijk, er zijn de 300 reacties die ik zou kunnen gebruiken, maar ik zou het niet weten waar te beginnen?

alle hulp zou geweldig zijn

BEWERKEN

Ik zou het kunnen testen door het zo te doen

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

maar ik kreeg het idee van deze vraagen het klinkt alsof dit krachtig omdat het de url specificeert waarnaar wordt omgeleid.

Heeft iemand zo’n werkende test?


Antwoord 1, autoriteit 100%

Om de test leesbaarder te maken, kunt u dit doen:
(rspec ~> 3.0)

expect(response).to redirect_to(action_path)

Antwoord 2, autoriteit 70%

Deze regel heeft een probleem

response.should redirect_to :back

De logica klopt niet. Je zou verwachten dat #editomleidt naar het :backpad dat je eerder hebt ingesteld, namelijk /scorecard. Maar je stelt hier :backin. In de context van Rspec moet :backbij elk voorbeeld leeg zijn.

Om te herzien, stel het in als

response.should redirect_to '/scorecard'

Antwoord 3, autoriteit 5%

Om te testen of er omleidingen hebben plaatsgevonden, zonder overeenkomende route

(alleen om de omleiding te testen, ik heb dit gebruikt als de route te lang is 😀 ).
Je kunt gewoon doen zoals:

expect(response.status).to eq(302) #redirected

Other episodes