123456789_123456789_123456789_123456789_123456789_

Class: ActionDispatch::SystemTestCase

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, 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 Cuprite, update your Gemfile to use Cuprite 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/cuprite"

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :cuprite, 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 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

::ActiveSupport::Testing::Assertions - Included

UNTRACKED

::ActiveSupport::TestCase - Inherited

Assertion

Class Attribute Summary

::ActiveSupport::TestCase - Inherited

.file_fixture_path, .file_fixture_path?,
.test_order

Returns the order in which test cases are run.

.test_order=

Sets the order in which test cases are run.

Class Method Summary

::ActiveSupport::TestCase - Inherited

.fixture_paths

Returns the ::ActiveRecord::FixtureSet collection.

.fixture_paths=

Sets the given path to the fixture set.

.parallelize

Parallelizes the test suite.

.parallelize_setup

Set up hook for parallel testing.

.parallelize_teardown

Clean up hook for parallel testing.

::ActiveSupport::Testing::Declarative - Extended

test

Helper to define a test method using a ::String.

Instance Attribute Summary

Instance Method Summary

SystemTesting::TestHelpers::ScreenshotHelper - Included

SystemTesting::TestHelpers::SetupAndTeardown - Included

::ActiveSupport::TestCase - Inherited

::ActiveSupport::Testing::FileFixtures - Included

#file_fixture

Returns a ::Pathname to the fixture file named fixture_name.

::ActiveSupport::Testing::TimeHelpers - Included

#after_teardown,
#freeze_time

Calls travel_to with Time.now.

#travel

Changes current time to the time in the future or in the past by a given time difference by stubbing Time.now, Date.today, and DateTime.now.

#travel_back

Returns the current time back to its original state, by removing the stubs added by travel, travel_to, and freeze_time.

#travel_to

Changes current time to the given time by stubbing Time.now, Time.new, Date.today, and DateTime.now to return the time or date passed into this method.

#unfreeze_time
#simple_stubs

::ActiveSupport::Testing::ConstantStubbing - Included

#stub_const

Changes the value of a constant for the duration of a block.

::ActiveSupport::Testing::Deprecation - Included

#assert_deprecated

Asserts that a matching deprecation warning was emitted by the given deprecator during the execution of the yielded block.

#assert_not_deprecated

Asserts that no deprecation warnings are emitted by the given deprecator during the execution of the yielded block.

#collect_deprecations

Returns the return value of the block and an array of all the deprecation warnings emitted by the given deprecator during the execution of the yielded block.

::ActiveSupport::Testing::ErrorReporterAssertions - Included

#assert_error_reported

Assertion that the block should cause at least one exception to be reported to Rails.error.

#assert_no_error_reported

Assertion that the block should not cause an exception to be reported to Rails.error.

::ActiveSupport::Testing::Assertions - Included

#assert_changes

Assertion that the result of evaluating an expression is changed before and after invoking the passed in block.

#assert_difference

Test numeric difference between the return value of an expression as a result of what is evaluated in the yielded block.

#assert_no_changes

Assertion that the result of evaluating an expression is not changed before and after invoking the passed in block.

#assert_no_difference

Assertion that the numeric result of evaluating an expression is not changed before and after invoking the passed in block.

#assert_not

Asserts that an expression is not truthy.

#assert_nothing_raised

Assertion that the block should not raise an exception.

#assert_raise
#assert_raises

Asserts that a block raises one of exp.

#_assert_nothing_raised_or_warn

::ActiveSupport::Testing::AssertionlessTests - Included

::ActiveSupport::Testing::SetupAndTeardown - Included

::ActiveSupport::Testing::TaggedLogging - Included

Constructor Details

.newSystemTestCase

This method is for internal use only.
[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 122

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) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 191

def method_missing(name, ...)
  if url_helpers.respond_to?(name)
    url_helpers.public_send(name, ...)
  else
    super
  end
end

Class Attribute Details

.driver (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 138

class_attribute :driver, instance_accessor: false

.driver?Boolean (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 138

class_attribute :driver, instance_accessor: false

Class Method Details

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

System Test configuration options

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

Examples:

driven_by :cuprite

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
[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 158

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

.served_by(host:, port:)

Configuration for the System Test application server.

By default this is localhost. This method allows the host and port to be specified manually.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 167

def self.served_by(host:, port:)
  Capybara.server_host = host
  Capybara.server_port = port
end

.start_application

This method is for internal use only.
[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 128

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

  SystemTesting::Server.new.run
end

Instance Method Details

#respond_to_missing?(name, include_private = false) ⇒ Boolean (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 199

def respond_to_missing?(name, include_private = false)
  url_helpers.respond_to?(name)
end

#url_helpers (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_test_case.rb', line 173

def url_helpers
  @url_helpers ||=
    if ActionDispatch.test_app
      Class.new do
        include ActionDispatch.test_app.routes.url_helpers
        include ActionDispatch.test_app.routes.mounted_helpers

        def url_options
          default_url_options.reverse_merge(host: app_host)
        end

        def app_host
          Capybara.app_host || Capybara.current_session.server_url || DEFAULT_HOST
        end
      end.new
    end
end