Setup RSpec

Even though Rails uses Minitest per default, RSpec is the de-facto standard at Renuo. We love RSpec and we strongly suggest to use it.

Add the following gems to your Gemfile:

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

group :test do
  gem 'shoulda-matchers'
  gem 'simplecov', require: false
  gem 'super_diff'
end

You should know exactly why you are adding each one of them and why is necessary.

  • Also add /coverage/ to your .gitignore file.
  • Remove the test folder from your project (there will be one called spec later).

Configuration

  • Install rspec via rails generate rspec:install

  • Create a bin stub with bundle binstubs rspec-core

  • At the top of the spec/spec_helper.rb

    require 'simplecov'
    SimpleCov.start 'rails' do
      add_filter 'app/channels/application_cable/channel.rb'
      add_filter 'app/channels/application_cable/connection.rb'
      add_filter 'app/jobs/application_job.rb'
      add_filter 'app/mailers/application_mailer.rb'
      add_filter 'app/models/application_record.rb'
      add_filter '.semaphore-cache'
      enable_coverage :branch
      minimum_coverage line: 100, branch: 100
    end
    

    to run code coverage and exclude files with less then 5 lines of code.

  • Inside spec/spec_helper.rb we suggest you to uncomment/enable the following:

    config.disable_monkey_patching!
    config.default_formatter = 'doc' if config.files_to_run.one?
    config.profile_examples = 5
    config.order = :random
    Kernel.srand config.seed
    
    config.define_derived_metadata do |meta|
      meta[:aggregate_failures] = true
    end
    

    Please check the spec_helper template

  • Add the configurations:

    # spec/rails_helper.rb:
    
      # after `require 'rspec/rails'`
      require 'capybara/rspec'
      require 'capybara/rails'
      require 'selenium/webdriver'
      require 'super_diff/rspec-rails'
    
      Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
    
      # ... (omitted configs here)
    
      RSpec.configure do |config|
        # ... (omitted configs here)
    
        config.before do |example|
          ActionMailer::Base.deliveries.clear
          I18n.locale = I18n.default_locale
          Rails.logger.debug { "--- #{example.location} ---" }
        end
    
        config.after do |example|
          Rails.logger.debug { "--- #{example.location} FINISHED ---" }
        end
    
        config.before(:each, type: :system) do
          driven_by :rack_test
        end
    
        config.before(:each, type: :system, js: true) do
          driven_by ENV['SELENIUM_DRIVER']&.to_sym || :selenium_chrome_headless
        end
      end
    
    # config/application.example.yml
    test:
      # SELENIUM_DRIVER: 'selenium_chrome'
      SELENIUM_DRIVER: 'selenium_chrome_headless'
    

Please check the full rails_helper template to compare.

  • Add the line bundle exec rspec to bin/check

Note: If you want to debug a spec, you can simply uncomment the line SELENIUM_DRIVER in the application.yml to not run it headless:

CleanShot 2021-06-25 at 16 54 22

✅ Our first (green) test

We are now going to write a first test to ensure that the whole configuration is working:

  • bin/check should be green ✅
  • Write the test spec/system/health_spec.rb
  • Run bin/check and the test should pass and coverage is 100%.

Commit and push your changes! 🎉

⭐️ The default health check path for Rails is /up. Learn more in the Rails guides.
To customize the health check and add additional checks, you can override the Rails::HealthController class.
You can find an example that also checks the database connection in this file.

Verify

Check that you see a green page in each app.

Javascript error reporter

Please check the rails_helper template to compare.