Como posso usar modelos de simulação em especificações do controlador Authlogic?
-
06-07-2019 - |
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?
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.