Rieles, Restful Authentication & RSpec - Cómo probar los nuevos modelos que requieren autenticación

StackOverflow https://stackoverflow.com/questions/64827

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.

¿Fue útil?

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 describes 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

El secado de su CRUD controlador de RSpecs

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top