Comment puis-je utiliser RSpec pour tester le code de réponse sur un CanCan échec de l'autorisation?
Je suis en train de travailler sur un des rails de projet dans lequel j'utilise CanCan à autoriser mes ressources. Lorsqu'un utilisateur n'est pas connecté et qu'il tente d'envoyer un "discours" (via une requête ajax formulaire de soumission), french CanCan correctement soulève un 401 avec {"status":"error","message":"You must be logged in to do that!"}
que la réponse (j'ai vérifié cela dans le navigateur à l'aide de firebug). Cependant, dans mes tests, obtenez une réponse 302 code plutôt qu'un 401:
class TalksController < ApplicationController
authorize_resource
def create
@talk = current_user.talks.build(params[:talk])
respond_to do |format|
if @talk.save
response = { :redirect => talk_path(@talk) }
format.html { redirect_to @talk, notice: 'Talk was successfully created.' }
format.json { render json: response, status: :created, }
else
format.html { render action: "new" }
format.json { render json: @talk.errors, status: :unprocessable_entity }
end
end
end
end
talks_controller_spec.rb:
describe TalksController do
describe "POST create" do
context "when not signed in" do
it "should not assign talk" do
post :create
assigns[:talk].should be_nil
end
it "should respond with a 401" do
post :create
response.response_code.should == 401
end
end
end
end
Le premier exemple fourni ici est réussi (ayants droit[:parler] n'est pas assigné), mais la seconde ne l'est pas:
1) TalksController POST create when not signed in should respond with a 401
Failure/Error: response.response_code.should == 401
expected: 401
got: 302 (using ==)
# ./spec/controllers/talks_controller_spec.rb:53:in `block (4 levels) in <top (required)>'
Je ne suis pas sûr exactement ce qu'il se passe. Est-il un moyen que je puisse le tester pour le code de la réponse renvoyée au navigateur? Ou une meilleure façon que je puisse tester l'autorisation?
post :create, :format => :json
et voir si cela aide.Merci pour la suggestion! Malheureusement, j'obtiens toujours la même 302 code après l'ajout de l' :format => :json.
Avez-vous regardé le journal de test?
OriginalL'auteur Matt McCormick | 2011-10-06
Vous devez vous connecter pour publier un commentaire.
Comme il s'est avéré, mon projet a sauvé l'autorisation d'exceptions de french CanCan à la fonction suivante. Parce que la fonction ne soulève 401 lors de la requête ajax (et redirige le contraire), j'ai été faire un 401 dans le navigateur, mais pas dans mes tests.
Grâce à zététitien pour suggérer-je vérifier mon test de journaux, comme cela a révélé la différence dans les demandes.
OriginalL'auteur Matt McCormick