Creio que a maioria dos desenvolvedores Rails utilizam a gem Devise para manipular tarefas de autenticação. Pela segunda vez, perdi bons minutos quebrando a cabeça para testar um método que depende do usuário da sessão. Vejamos…
Objetivo
Fazer um stub do current_user em um helper.
Cenário
Tenho um método que retorna se o usuário logado é administrador ou não.
def admin?
current_user.admin?
end
Conhecimento inicial
Saiba que é possível fazer o stub do current_user a partir do helper, não somente a partir do controller, ficando algo como:
allow(helper).to receive(:current_user) { User.new }
Teste inicial
Sabendo disso teríamos:
describe '#admin?' do
context 'when user is admin' do
before do
allow(helper).to receive(:current_user) { User.new admin: true }
end
it 'returns true' do
expect(admin?).to be_true
end
end
end
Problema
Ao rodarmos o teste, é dado que o método current_user é undefined:
undefined local variable or method `current_user`
Mas como se stubamos o current_user? É ai que acabamos quebrando a cabeça. Veja que o stub não foi feito direto no método, mas sim, pelo helper. Logo precisamos apenas fazer a chamada do método a partir do helper também, ficando:
expect(helper.admin?).to be_true
Agora estamos utilizando a parte do código com stub e o resultado será o esperado.