rails-intest-views

Generate view templates dynamically in Rails tests

MIT License

Downloads
3K
Stars
21
Committers
2

Rails Intest Views

Generate test views (templates) right from test files. Useful to test UI components (view components, partials, JS, etc.) in isolation.

A quick example of using an inline template to test view components via Rails system tests:

class ButtonComponentSystemTest < ApplicationSystemTestCase
  def test_submit_button
    visit_template <<~ERB
      <form id="myForm" onsubmit="event.preventDefault(); this.innerHTML = '';">
        <h2>Self-destructing form</h2>
        <%= render ButtonComponent.new(type: :submit) do %>
          Save me!
        <% end %>
      </form>
    ERB

    assert_text("Self-destructing form")

    click_button("Save me!")

    assert_no_text("Self-destructing form")
  end
end

Installation

Adding gem to your Gemfile:

# Gemfile
gem "rails-intest-views", group: :test

Supported Ruby/Rails versions

  • Ruby (MRI) >= 2.7.0
  • Rails 6+

Usage

To use intest templates with Capybara, you must first include the helper module:

# Minitest
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
 include RailsIntestViews::CapybaraHelpers

  # ...
end

# RSpec
RSpec.configure do |config|
  config.include RailsIntestViews::CapybaraHelpers, type: :system
end

Then, you can use the #visit_template helper in your tests:

visit_template <<~ERB
  <a href="#">Clicko!</a>
ERB

# some assertions/expectations

You can also specify the layout to use:

source = <<~ERB
  <a href="#">Clicko!</a>
ERB

visit_template source, layout: "custom"

View components are supported through the #render_component helper:

button = ButtonComponent.new(type: :submit) do
  "Save me!"
end

render_component button

View component-based layouts are supported as well:

button = ButtonComponent.new(type: :submit) do
  "Save me!"
end

render_component button, layout: PreviewLayout
# or
render_component button, layout: -> { PreviewLayout }

Configuration

The following configuration parameters are available (the default values are shown):

# a controller class used to render templates
config.rails_intest_views.templates_controller = "RailsIntestViews::TemplatesController"
# default layout to use; no layout by default (but you're likely to specify it to load scripts, styles, etc.)
config.rails_intest_views.default_layout = nil
# the mount path for the endpoint (the "/templates/:id" is added to the final URL)
config.rails_intest_views.mount_path = "/rails/intest"

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/palkan/rails-intest-views.

License

The gem is available as open source under the terms of the MIT License.