Rails/Rspec - test une redirection dans le contrôleur
Donc je suis en train d'écrire un test pour un contrôleur dans un contrôleur existant juste ne pas en avoir un avant. Ce que je veux est un test de redirection qui se passe quand quelqu'un n'est pas autorisé à modifier quelque chose vs quelqu'un qui est autorisé à le modifier.
le contrôleur de l'action modifier
def edit
if !@scorecard.reviewed? || admin?
@company = @scorecard.company
@custom_css_include = "confirmation_page"
else
redirect_to :back
end
end
Donc, si une carte de pointage a été examiné ensuite seul un administrateur peut modifier ce score.
Les itinéraires de 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 lorsque vous essayez de modifier une revue score sera redirigé, où un administrateur ne sera pas.
mais lors de l'exécution du présent par le biais de rspec-je obtenir
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 sa fonctionne ou pas depuis que j'ai mis le request.env["HTTP_REFERER"] = "/scorecard"
que la place qui devrait être la :back
comme ça où. ou alors j'ai loupé l'idée tous ensemble en regardant httpstatus il y a les 300 réponses que je pouvais l'utiliser mais je ne sais pas par où commencer?
toute aide serait génial
MODIFIER
J'ai pu le tester en faisant comme ceci
...
response.status.should be(302)
mais j'ai eu l'idée de cette question et il semble que cela pourrait être puissant car il permet de spécifier l'url redirigée.
Que quelqu'un a une épreuve de travail comme ça?
Vous devez vous connecter pour publier un commentaire.
Cette ligne a un problème
La logique n'est pas correct. Vous devez vous attendre
#edit
pour rediriger vers:back
chemin d'accès que vous définissez avant, qui est/scorecard
. Mais tu:back
ici. Dans le contexte de Rspec,:back
doit être vide à chaque exemple.À réviser, suffit de le définir comme
1) ScorecardsController GET edit as a va_user does not allow you to edit a reviewed scorecard
Failure/Error: response.should redirect_to '/scorecard'
Expected response to be a redirect to <http://test.host/scorecard> but was a redirect to <http://test.host/>
request.env["HTTP_REFERER"] = "/scorecard"
dans l'exemple à la place de avant de. J'ai peur que ce var seront perdues.it "does not allow you to edit a reviewed scorecard" do request.env["HTTP_REFERER"] = "/scorecard" get 'edit', :id => @scorecard.id response.should redirect_to "/scorecard" end
puis id obtiens toujours la même erreur de l'homme c'est dur pour obtenir le droit./scorecard
. Dans votreget edit
, vous agissez comme un visiteur normal sans connexion, j'ai peur que vous n'êtes pas autorisé à afficher la carte de bord de la page, et ensuite être redirigé vers la page d'accueil supplémentaires.Pour rendre le test plus lisible, vous pouvez faire ceci:
(rspec ~> 3.0)
Pour tester si les redirections qui s'est passé, sans itinéraire correspondant
(juste pour tester la redirection, j'ai utilisé ce lorsque la route est trop longue 😀 ).
Vous pouvez simplement faire comme: