System specs

System specs are RSpec’s wrapper around Rails’ own system tests.

System tests allow you to test user interactions with your application, running tests in either a real or a headless browser. System tests use Capybara under the hood.

By default, system tests are run with the Selenium driver, using the Chrome browser, and a screen size of 1400x1400. The next section explains how to change the default settings.

System specs are marked by setting type to :system, e.g. type: :system.

The Capybara gem is automatically required, and Rails includes it in generated application Gemfiles. Configure a webserver (e.g. Capybara.server = :webrick) before attempting to use system specs.

RSpec does not use your ApplicationSystemTestCase helper. Instead it uses the default driven_by(:selenium) from Rails. If you want to override this behaviour you can call driven_by manually in a test.

System specs run in a transaction. So unlike feature specs with javascript, you do not need DatabaseCleaner.

System specs driven by rack_test

Given a file named “spec/system/widgetsystemspec.rb” with:

require "rails_helper"

RSpec.describe "Widget management", type: :system do
  before do
    driven_by(:rack_test)
  end

  it "enables me to create widgets" do
    visit "/widgets/new"

    fill_in "Name", :with => "My Widget"
    click_button "Create Widget"

    expect(page).to have_text("Widget was successfully created.")
  end
end

When I run rspec spec/system/widget_system_spec.rb

Then the exit status should be 0

And the output should contain “1 example, 0 failures”.

The ActiveJob queue_adapter can be changed

Given a file named “spec/system/somejobsystem_spec.rb” with:

require "rails_helper"

class SomeJob < ActiveJob::Base
  cattr_accessor :job_ran

  def perform
    @@job_ran = true
  end
end

RSpec.describe "spec/system/some_job_system_spec.rb", type: :system do
  describe "#perform_later" do
    before do
      ActiveJob::Base.queue_adapter = :inline
    end

    it "perform later SomeJob" do
      expect(ActiveJob::Base.queue_adapter).to be_an_instance_of(ActiveJob::QueueAdapters::InlineAdapter)

      SomeJob.perform_later

      expect(SomeJob.job_ran).to eq(true)
    end
  end
end

When I run rspec spec/system/some_job_system_spec.rb

Then the example should pass.

System specs driven by seleniumchromeheadless

Given a file named “spec/system/widgetsystemspec.rb” with:

require "rails_helper"

RSpec.describe "Widget management", type: :system do
  before do
    driven_by(:selenium_chrome_headless)
  end

  it "enables me to create widgets" do
    visit "/widgets/new"

    fill_in "Name", :with => "My Widget"
    click_button "Create Widget"

    expect(page).to have_text("Widget was successfully created.")
  end
end

When I run rspec spec/system/widget_system_spec.rb

Then the output should contain “1 example, 0 failures”

And the output should not contain “starting Puma”

And the exit status should be 0.