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
end

Observe 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
end

A 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?