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
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?
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'
Pour rendre le test plus lisible, vous pouvez le faire: (rspec ~> 3.0)
expect(response).to redirect_to(action_path)
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