Pergunta

Eu estou tentando escrever especificações para um controlador sem o uso de luminárias (em vez empregando modelos de simulação). Este controlador exige que o usuário estar conectado, para o qual eu estou empregando AuthLogic , seguindo o recomendações do autor .

describe UsersController do

  def mock_user(stubs={})
    @mock_user ||= mock_model(User, stubs)
  end

  context 'when logged in' do
    before { activate_authlogic }

    it "exposes the logged-in user as @user in response to GET (show)" do
      UserSession.create(mock_user)
      ...
    end

    ...
  end

  ...
end

Esses exemplos todos falham na UserSession.create(...) linha, reportando-se o efeito de:

Mock 'User_1005' received unexpected message :changed? with (no args)

Eu não tenho certeza de como resolver este; está zombando com :changed? => false apropriado?

Foi útil?

Solução

Iain colocaram um href="http://iain.nl/2008/11/authlogic-is-awesome/" rel="nofollow solução a usar objetos fictícios com AuthLogic . Reformular, os seguintes ajudantes entrar em spec_helpers.rb:

def current_user(stubs = {})
  @current_user ||= mock_model(User, stubs)
end

def user_session(stubs = {}, user_stubs = {})
  @current_user_session ||= mock_model(UserSession, {:user => current_user(user_stubs)}.merge(stubs))
end

def login(session_stubs = {}, user_stubs = {})
  UserSession.stub!(:find).and_return(user_session(session_stubs, user_stubs))
end

def logout
  @user_session = nil
end

eu incorporei isso em meus óculos, e eu acho que ele faz exatamente o que eu estava esperando. Ficha do controlador que os modelos exploy simulados para o usuário conectado, então agora nem todos eles pausa eu trabalhar quando eu adicionar um campo ao usuário. exemplo de aplicação do presente em uma especificação de Iain é como:

describe SecretsController do
  before { login }
  it "should be very very secret!"
end

P.S. Eu odeio para responder à minha própria pergunta, mas esta é a resposta que eu estava procurando; Eu só não encontrá-lo cedo o suficiente.

Outras dicas

Authlogic espera que o registro para atos como uma instância de registro ativo. Você pode usar um exemplo real ou um mock, mas se você usar um mock / ramal você deve ter certeza de que responde a todos os métodos necessários por Authlogic.

Eu sugiro usar um objeto real registro ativo em vez de um mock. Se você não quiser usar um dispositivo elétrico, você pode usar uma fábrica.

A última opção seria passar um mock que responde a quaisquer métodos (você pode facilmente fazer isso através method_missing). O problema com essa solução é que você não sabe de antemão qual valor deve devolver qualquer chamada de método específico.

Sim, você pode passar falsa, mas isso não é realmente uma solução. Seria necessário tentar manualmente / adicionar um valor padrão até encontrar o objeto fictício responder a todas a solicitação Authlogic. Mas isso exigiria que você siga constantemente authlogic para qualquer mudança interna para corrigir as chamadas não atendidas para o seu topo.

Em Rails 3 deste zombeteiro de UserSession não funciona mais, uma vez UserSession de AuthLogic não é uma instância de ActiveRecord :: Base. Correção que funciona para mim:

class UserSession < Authlogic::Session::Base
  extend ActiveModel::Naming
end

Eu encontrei zombando objetos Authlogic eram eram difíceis e eu, em última análise deu-se em zombando. Em vez disso, eu agora usar um geradores abordagem utilizando objeto pai . Meus testes funcionais são muito mais felizes agora. BTW, deveria ter + object_daddy absolutamente rochas. contextos transacionais do Shoulda garantir que meu banco de dados de teste permanece limpo e eu não tenho a zombar objetos activerecord simples em primeiro lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top