ruby-on-rails - rspec rails
Rails/Rspec-probando una redirección en el controlador (2)
Esta linea tiene problema
response.should redirect_to :back
La lógica no es correcta Debería esperar que #edit
redireccione a :back
ruta de acceso anterior configurada anteriormente, que es /scorecard
. Pero estableces :back
aquí. En el contexto de Rspec,: :back
debe estar vacío en cada ejemplo.
Para revisar, simplemente configúralo como
response.should redirect_to ''/scorecard''
Así que actualmente estoy escribiendo una prueba para un controlador en un controlador existente que simplemente no tenía uno antes. lo que quiero probar es una redirección que ocurre cuando alguien no puede editar algo en comparación con alguien que tiene permiso para editarlo.
la acción del controlador que se está editando
def edit
if [email protected]? || admin?
@company = @scorecard.company
@custom_css_include = "confirmation_page"
else
redirect_to :back
end
end
Entonces, si se ha revisado una tabla de puntuación, solo un administrador puede editarla. Las rutas para ese controlador ...
# scorecards
resources :scorecards do
member do
get ''report''
end
resources :inaccuracy_reports, :only => [:new, :create]
end
y finalmente la prueba
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
por lo que se redireccionará una va al intentar editar una puntuación revisada, donde un administrador no lo hará.
pero al ejecutar esto a través de rspec consigo
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
así que no sé si está funcionando o no, ya que configuré request.env["HTTP_REFERER"] = "/scorecard"
como el lugar que debería ser :back
como estaba. ¿O me estoy perdiendo la idea de que, al mirar httpstatus hay 300 respuestas que podría usar, pero no sabría por dónde empezar?
Cualquier ayuda sería increíble
EDITAR
podría probarlo haciéndolo así
...
response.status.should be(302)
pero obtuve la idea de esta question y parece que esto podría ser poderoso ya que especifica la URL a la que se redirige.
cualquiera tiene una prueba de trabajo como esta
Para hacer que la prueba sea más legible, puede hacer esto: (rspec ~> 3.0)
expect(response).to redirect_to(action_path)