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 :back
zoals 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 #edit
omleidt naar het :back
pad dat je eerder hebt ingesteld, namelijk /scorecard
. Maar je stelt hier :back
in. In de context van Rspec moet :back
bij 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