Configurando RSpec no Rails - 2020

React

Sou um defensor do TDD e recomendo a todos o uso das práticas do TDD em seus projetos, lógico, depende do tamanho do sistema e da complexidade das funcionalidades do mesmo, mas isso é um assunto pra outra hora, aqui vai uma configuração inicial do RSpec, biblioteca mais utilizada para testes no ecossistema Ruby e Rails, então, let's do it!

Supondo que já tenha um projeto Rails criado, acesse o seu arquivo Gemfile e adicione:

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'faker'
end

group :test do
  gem 'database_cleaner'
  gem 'shoulda-matchers'
end

Agora instale todas as novas dependências com o comando:

bundle install

E instale as dependências do RSpec:

bundle generate rspec:install

Criando alguns arquivos de suporte:

Dentro da pasta spec, na raíz do projeto crie uma outra pasta chamada support.

O primeiro arquivo é para o database_cleaner.rb.

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
  
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end

O segundo é o factory_bot.rb.

RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
end

E o terceiro é o shoulda_matchers.rb.

Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    with.test_framework :rspec
    with.library :rails
  end
end

E descomente a seguinte linha no arquivo no arquivo rails_helper.rb.

Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }

Crie uma pasta para as Factories chamada factories dentro da pasta spec.

Agora crie suas factories utilizando todas as praticidades da Gem Faker, por exemplo users.rb.

FactoryBot.define do
  factory :user do
    email { Faker::Internet.email }
    name { 'Kylo Ren' }
    password { 'cometothedarkside' }
    user_category
  end
end

Agora vamos escrever nossa primeira spec.

spec/models/user_spec.rb

require "rails_helper"

RSpec.describe User, type: :model do

  describe 'relationships' do
    it { is_expected.to belong_to :user_category }
  end
  
  describe 'validations' do
    it { is_expected.to validate_presence_of :name }

    context 'uniqueness' do
      let!(:user) { create(:user, email: email, password: password) }
      let!(:email) { Faker::Internet.email }
      let!(:password) { "teste123" }

      context 'when exist user with same email' do
        subject { described_class.new(email: email) }
        
        it 'is error to email' do
          subject.valid?
          expect(subject.valid?).to be_falsy
        end
      end
    end
  end
end

Esse é apenas um modelo, você pode criar um teste mais fácil apenas pra verificar se está tudo configurado corretamente:

require "rails_helper"

RSpec.describe "Some test" do
  it 'is true' do
    expect(true).to be(true)
  end 
end

E agora testar no console pra ver se está tudo ok.

bundle exec rspec .

Ou apenas

rspec .

Se estiver tudo verde, então é um ótimo sinal e agora já podemos começar a escrever nossos testes utilizando o RSpec, é isso ai!