Class: ActionDispatch::SystemTestCase

Inherits:
ActiveSupport::TestCase show all
Includes:
ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper, ActionDispatch::SystemTesting::TestHelpers::SetupAndTeardown, Capybara::DSL, Capybara::Minitest::Assertions
Defined in:
actionpack/lib/action_dispatch/system_test_case.rb

Overview

System Testing

System tests let you test applications in the browser. Because system tests use a real browser experience, you can test all of your JavaScript easily from your test suite.

To create a system test in your application, extend your test class from ApplicationSystemTestCase. System tests use Capybara as a base and allow you to configure the settings through your application_system_test_case.rb file that is generated with a new application or scaffold.

Here is an example system test:

require "application_system_test_case"

class Users::CreateTest < ApplicationSystemTestCase
  test "adding a new user" do
    visit users_path
    click_on 'New User'

    fill_in 'Name', with: 'Arya'
    click_on 'Create User'

    assert_text 'Arya'
  end
end

When generating an application or scaffold, an application_system_test_case.rb file will also be generated containing the base class for system testing. This is where you can change the driver, add Capybara settings, and other configuration for your system tests.

require "test_helper"

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
end

By default, ActionDispatch::SystemTestCase is driven by the Selenium driver, with the Chrome browser, and a browser size of 1400x1400.

Changing the driver configuration options is easy. Let's say you want to use the Firefox browser instead of Chrome. In your application_system_test_case.rb file add the following:

require "test_helper"

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :firefox
end

driven_by has a required argument for the driver name. The keyword arguments are :using for the browser and :screen_size to change the size of the browser screen. These two options are not applicable for headless drivers and will be silently ignored if passed.

Headless browsers such as headless Chrome and headless Firefox are also supported. You can use these browsers by setting the :using argument to :headless_chrome or :headless_firefox.

To use a headless driver, like Poltergeist, update your Gemfile to use Poltergeist instead of Selenium and then declare the driver name in the application_system_test_case.rb file. In this case, you would leave out the :using option because the driver is headless, but you can still use :screen_size to change the size of the browser screen, also you can use :options to pass options supported by the driver. Please refer to your driver documentation to learn about supported options.

require "test_helper"
require "capybara/poltergeist"

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :poltergeist, screen_size: [1400, 1400], options:
    { js_errors: true }
end

Some drivers require browser capabilities to be passed as a block instead of through the options hash.

As an example, if you want to add mobile emulation on chrome, you'll have to create an instance of selenium's Chrome::Options object and add capabilities with a block.

The block will be passed an instance of <Driver>::Options where you can define the capabilities you want. Please refer to your driver documentation to learn about supported options.

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :chrome, screen_size: [1024, 768] do |driver_option|
    driver_option.add_emulation(device_name: 'iPhone 6')
    driver_option.add_extension('path/to/chrome_extension.crx')
  end
end

Because ActionDispatch::SystemTestCase is a shim between Capybara and Rails, any driver that is supported by Capybara is supported by system tests as long as you include the required gems and files.

Constant Summary

Constants inherited from ActiveSupport::TestCase

ActiveSupport::TestCase::Assertion

Constants included from ActiveSupport::Testing::Assertions

ActiveSupport::Testing::Assertions::UNTRACKED

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper

#take_failed_screenshot, #take_screenshot

Methods included from ActionDispatch::SystemTesting::TestHelpers::SetupAndTeardown

#after_teardown, #before_teardown, #host!

Methods inherited from ActiveSupport::TestCase

parallelize, parallelize_setup, parallelize_teardown, test_order, test_order=

Methods included from ActiveSupport::Testing::Declarative

#test

Methods included from ActiveSupport::Testing::FileFixtures

#file_fixture

Methods included from ActiveSupport::Concern

#append_features, #class_methods, extended, #included, #prepend_features, #prepended

Methods included from ActiveSupport::Testing::TimeHelpers

#after_teardown, #freeze_time, #travel, #travel_back, #travel_to

Methods included from ActiveSupport::Testing::Deprecation

#assert_deprecated, #assert_not_deprecated, #collect_deprecations

Methods included from ActiveSupport::Testing::Assertions

#assert_changes, #assert_difference, #assert_no_changes, #assert_no_difference, #assert_not, #assert_nothing_raised

Methods included from ActiveSupport::Testing::TaggedLogging

#before_setup

Constructor Details

#initializeSystemTestCase

:nodoc:


119
120
121
122
123
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 119

def initialize(*) # :nodoc:
  super
  self.class.driven_by(:selenium) unless self.class.driver?
  self.class.driver.use
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object (private)


176
177
178
179
180
181
182
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 176

def method_missing(name, *args, &block)
  if url_helpers.respond_to?(name)
    url_helpers.public_send(name, *args, &block)
  else
    super
  end
end

Class Method Details

.driven_by(driver, using: :chrome, screen_size: [1400, 1400], options: {}, &capabilities) ⇒ Object

System Test configuration options

The default settings are Selenium, using Chrome, with a screen size of 1400x1400.

Examples:

driven_by :poltergeist

driven_by :selenium, screen_size: [800, 800]

driven_by :selenium, using: :chrome

driven_by :selenium, using: :headless_chrome

driven_by :selenium, using: :firefox

driven_by :selenium, using: :headless_firefox

155
156
157
158
159
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 155

def self.driven_by(driver, using: :chrome, screen_size: [1400, 1400], options: {}, &capabilities)
  driver_options = { using: using, screen_size: screen_size, options: options }

  self.driver = SystemTesting::Driver.new(driver, **driver_options, &capabilities)
end

.start_applicationObject

:nodoc:


125
126
127
128
129
130
131
132
133
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 125

def self.start_application # :nodoc:
  Capybara.app = Rack::Builder.new do
    map "/" do
      run Rails.application
    end
  end

  SystemTesting::Server.new.run
end