Rieles, Restful Authentication & RSpec - Cómo probar los nuevos modelos que requieren autenticación
-
09-06-2019 - |
Pregunta
He creado una aplicación de aprendizaje mediante Bort, que es una base de la aplicación que incluye Restful Authentication y RSpec.Ya lo tengo funcionando y se añade un nuevo objeto que requiere que los usuarios se registren antes de que pueden hacer cualquier cosa(before_filter :login_required
en el controlador).[editar:También debo mencionar que el usuario has_many
de la nueva clase y sólo el usuario debe ser capaz de ver.]
He creado el nuevo modelo/controlador con Rspec los generadores que han creado un número predeterminado de pruebas.Todos ellos pasan si no hay before_filter
pero varios fallar, como se debe esperar, una vez que el before_filter
está en el lugar.
¿Cómo puedo obtener las pruebas generadas a correr como si no es/no es un usuario registrado?Necesito un lote entero de coincidencia no se registra en redirigir las pruebas?Supongo que es algún tipo de burla o accesorio de la técnica, pero soy nuevo en RSpec y un poco a la deriva.Bueno RSpec tutorial de enlaces también sería apreciada.
Solución
Yo tengo una muy similar de configuración, y a continuación está el código que estoy utilizando actualmente para probar estas cosas.En cada uno de los describe
s me puso:
it_should_behave_like "login-required object"
def attempt_access; do_post; end
Si todo lo que usted necesita es un inicio de sesión, o
it_should_behave_like "ownership-required object"
def login_as_object_owner; login_as @product.user; end
def attempt_access; do_put; end
def successful_ownership_access
response.should redirect_to(product_url(@product))
end
Si usted necesita la propiedad.Obviamente, los métodos auxiliares de cambio (muy poco) con cada vuelta, pero esto no hace la mayoría del trabajo para usted.Esto es en mi spec_helper.rb
shared_examples_for "login-required object" do
it "should not be able to access this without logging in" do
attempt_access
response.should_not be_success
respond_to do |format|
format.html { redirect_to(login_url) }
format.xml { response.status_code.should == 401 }
end
end
end
shared_examples_for "ownership-required object" do
it_should_behave_like "login-required object"
it "should not be able to access this without owning it" do
attempt_access
response.should_not be_success
respond_to do |format|
format.html { response.should be_redirect }
format.xml { response.status_code.should == 401 }
end
end
it "should be able to access this if you own it" do
login_as_object_owner
attempt_access
if respond_to?(:successful_ownership_access)
successful_ownership_access
else
response.should be_success
end
end
end
Otros consejos
Cuando no se prueba la autenticación, pero las pruebas de los controladores que necesita el usuario para autenticarse yo generalmente punta de el método de filtro:
before(:each) do
controller.stub!(:authenticate).and_return(true)
end
El ejemplo anterior funciona donde mi before_filter se establece en el método de autenticación:
before_filter :authenticate
y la autenticar en mi app utiliza la Autenticación Básica de HTTP, pero lo que realmente puede ser cualquier otro mecanismo de autenticación.
private
def authenticate
authenticate_or_request_with_http_basic do |user,password|
user == USER_NAME && password == PASSWORD
end
end
Creo que es una muy sencilla a la hora de la prueba.
He encontrado algunas respuestas a mis propias preguntas.Básicamente, necesitaba entender cómo burlarse de el usuario de restful_authentication
así que autogenera el rspec controlador de pruebas podría pasar a pesar de que yo había añadido before_filter: login_required
.
Aquí están algunos de mis acabo de encontrar recursos:
RSpec:Se Deben Comportarse Como
rspec, restful_authentication, y login_required
el uso de restful_authentication current_user dentro de controlador de especificaciones
Para burlarse de un usuario iniciar sesión, me piratear el controlador para establecer @current_user
manualmente:
module AuthHelper
protected
def login_as(model, id_or_attributes = {})
attributes = id_or_attributes.is_a?(Fixnum) ? {:id => id} : id_or_attributes
@current_user = stub_model(model, attributes)
target = controller rescue template
target.instance_variable_set '@current_user', @current_user
if block_given?
yield
target.instance_variable_set '@current_user', nil
end
return @current_user
end
def login_as_user(id_or_attributes = {}, &block)
login_as(User, id_or_attributes, &block)
end
end