Trilhos, Repousante de Autenticação e RSpec - Como testar os novos modelos que requerem autenticação

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

Pergunta

Eu criei uma aprendizagem aplicativo usando Bort, que é uma base aplicativo que inclui Restful Autenticação e RSpec.Eu tenho ele funcionando, e adicionado um novo objeto que exige que os usuários estejam registrados em diante eles podem fazer qualquer coisa(before_filter :login_required no controlador).[editar:Gostaria também de mencionar que o usuário has_many a nova classe e somente o usuário deve ser capaz de vê-lo.]

Eu criei o novo modelo/controlador usando Rspec os geradores, que criou uma série de testes padrão.Todos eles passarem, se não há before_filter mas vários falhar, como deve ser esperado, uma vez que o before_filter é no lugar.

Como faço para obter a geração de testes a ser executado como se há/não é um usuário conectado?Preciso de um lote inteiro de correspondência não registrado no redirecionamento de testes?Eu suponho que é uma espécie de simulação ou de fixação de técnica, mas eu sou novo para RSpec e um pouco à deriva.Bom RSpec tutorial links também seria apreciada.

Foi útil?

Solução

Eu tenho um muito semelhante configuração, e abaixo está o código que eu estou usando atualmente para testar essas coisas.Em cada um dos describes eu posto:

it_should_behave_like "login-required object"
def attempt_access; do_post; end

Se tudo o que você precisa é de um login, ou

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

Se você precisa de propriedade.Obviamente, os métodos auxiliares de alteração (muito pouco) com cada vez, mas isso não faz a maioria do trabalho para você.Esta é na minha 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

Outras dicas

Quando não testar a autenticação porém, os testes de controladores que necessita de o utilizador ser autenticado eu geralmente stub o método de filtro:

before(:each) do
  controller.stub!(:authenticate).and_return(true)
end

O exemplo acima funciona onde meu before_filter é definido para autenticar método:

before_filter :authenticate

e a autenticar no meu aplicativo usa a Autenticação Básica HTTP, mas ele realmente pode ser qualquer outro mecanismo de autenticação.

private
def authenticate
  authenticate_or_request_with_http_basic do |user,password|
    user == USER_NAME && password == PASSWORD
  end
end

Eu acho que é uma forma bastante simples para testar.

Eu encontrei algumas respostas para a minha pergunta.Basicamente, eu precisava entender como a zombar do usuário a partir de restful_authentication para que a auto-gerado rspec testes do controlador poderia passar, mesmo que eu tivesse adicionado before_filter: login_required.

Aqui estão alguns dos meus acabei de recursos:

RSpec:Ele Deve Comportar-Se Como

rspec, restful_authentication, e login_required

usando restful_authentication current_user dentro do controlador especificações

Secando o seu CRUD controlador de RSpecs

A simulação de um usuário conectado, eu invadir o controlador a definir @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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top