Testando Devise
Testando models
Para testar as models associadas ao Devise, vamos usar como exemplo a model User:
rails g devise User name:string
Lembre-se de fazer a migração:
rails db:migrate
Se você fez a instalação do rspec e do factory-bot corretamente como descrita nos passos Instalação do rspec e Instalação do Factory Bot, então na pasta rspec/factories deve ter sido criado o arquivo users.rb e na pasta rspec/models criado o arquivo user_spec.rb.
Com isso, fazemos como nas outras models, com o uso do factory bot, para criar um default User:
FactoryBot.define do
factory :user do
name { 'teste' }
email { 'email@teste.com' }
password { '12345678' }
password_confirmation { '12345678' }
end
endObserve que precisamos colocar um email e senha que são obrigatórias para uma model do Devise.
Feito isso, podemos começar a testar a model no user_spec.rb como foi feito anteriormente:
RSpec.describe User, type: :model do
describe 'factory' do
context 'when using standard factory' do
it { expect(build(:user)).to be_valid }
end
end
describe 'validations' do
context 'when user does not have an email' do
it { expect(build(:user, email: nil)).not_to be_valid }
end
end
endA partir disso, podemos adicionar outras validações que dependerão das validations da model User(no arquivo app/models/user.rb), como presence do name:
validates :name, presence: true
Dessa forma:
Testando controllers que exigem autenticação
Para testarmos controllers, será necessário adicionar no arquivo rails_helper.rb criado automaticamente na própria pasta rspec as seguintes linhas dentro do bloco RSpec.configure do |config|:
Assim, o bloco RSpec.configure do |config| deve ficar mais ou menos assim:
Agora podemos começar a montar os testes das nossas controllers.
Suponha que na sua aplicação o usuário(user) tenha produtos favoritos que ele quer adicionar para poupar tempo. Dessa forma, na controller de favoritos, você pode querer colocar uma função para ver favoritos e outra para criar favoritos:
Como iríamos testar esses métodos se eles requerem o user estar logado? A resposta é simples: precisamos criar o user e usar o token e o email dele nos headers quando chamar o get/post:
E a mesma coisa faríamos para testar o método post:
E quando o user não está logado, como testamos a falha na autenticação?
Como mostrado, usamos o authentication_failure_path que criamos na configuração do devise. Dessa forma, como no post não foram informados o token e o email do user, a resposta foi redirecionada para o authentication_failure_path e no teste conseguimos testar isso também.
Last updated
Was this helpful?