Skip to main content

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/widget_system_spec.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/some_job_system_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 selenium_chrome_headless

Given a file named "spec/system/widget_system_spec.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.