module ViewComponent::TestHelpers

def build_controller(klass)

Other tags:
    Private: -
def build_controller(klass)
  klass.new.tap { |c| c.request = request }.extend(Rails.application.routes.url_helpers)
end

def controller

Other tags:
    Private: -
def controller
  @controller ||= build_controller(Base.test_controller.constantize)
end

def page

def page
  @page ||= Capybara::Node::Simple.new(rendered_content)
end

def refute_component_rendered

def refute_component_rendered
  assert_no_selector("body")
end

def render_in_view_context(&block)

```
assert_text("Hello, World!")

end
render(MyComponent.new)
render_in_view_context do
```ruby

`Capybara::Node::Simple`, allowing for Capybara assertions to be used:
Execute the given block in the view context. Internally sets `page` to be a
def render_in_view_context(&block)
  @page = nil
  @rendered_content = controller.view_context.instance_exec(&block)
  Nokogiri::HTML.fragment(@rendered_content)
end

def render_inline(component, **args, &block)

Returns:
  • (Nokogiri::HTML) -

Parameters:
  • component (ViewComponent::Base, ViewComponent::Collection) -- The instance of the component to be rendered.
def render_inline(component, **args, &block)
  @page = nil
  @rendered_content =
    if Rails.version.to_f >= 6.1
      controller.view_context.render(component, args, &block)
    else
      controller.view_context.render_component(component, &block)
    end
  Nokogiri::HTML.fragment(@rendered_content)
end

def render_preview(name)

Returns:
  • (Nokogiri::HTML) -

Parameters:
  • preview (String) -- The name of the preview to be rendered.
def render_preview(name)
  begin
    preview_klass = if respond_to?(:described_class)
      raise "`render_preview` expected a described_class, but it is nil." if described_class.nil?
      "#{described_class}Preview"
    else
      self.class.name.gsub("Test", "Preview")
    end
    preview_klass = preview_klass.constantize
  rescue NameError
    raise NameError, "`render_preview` expected to find #{preview_klass}, but it does not exist."
  end
  previews_controller = build_controller(Rails.application.config.view_component.preview_controller.constantize)
  previews_controller.request.params[:path] = "#{preview_klass.preview_name}/#{name}"
  previews_controller.response = ActionDispatch::Response.new
  result = previews_controller.previews
  @rendered_content = result
  Nokogiri::HTML.fragment(@rendered_content)
end

def rendered_component

Returns:
  • (String) -
def rendered_component
  ViewComponent::Deprecation.warn(
    "`rendered_component` is deprecated and will be removed in v3.0.0. " \
    "Use `page` instead."
  )
  rendered_content
end

def request

Other tags:
    Private: -
def request
  @request ||=
    begin
      request = ActionDispatch::TestRequest.create
      request.session = ActionController::TestSession.new
      request
    end
end

def with_controller_class(klass)

Parameters:
  • klass (ActionController::Base) -- The controller to be used.
def with_controller_class(klass)
  old_controller = defined?(@controller) && @controller
  @controller = build_controller(klass)
  yield
ensure
  @controller = old_controller
end

def with_request_url(path)

Parameters:
  • path (String) -- The path to set for the current request.
def with_request_url(path)
  old_request_path_info = request.path_info
  old_request_path_parameters = request.path_parameters
  old_request_query_parameters = request.query_parameters
  old_request_query_string = request.query_string
  old_controller = defined?(@controller) && @controller
  path, query = path.split("?", 2)
  request.path_info = path
  request.path_parameters = Rails.application.routes.recognize_path(path)
  request.set_header("action_dispatch.request.query_parameters", Rack::Utils.parse_nested_query(query))
  request.set_header(Rack::QUERY_STRING, query)
  yield
ensure
  request.path_info = old_request_path_info
  request.path_parameters = old_request_path_parameters
  request.set_header("action_dispatch.request.query_parameters", old_request_query_parameters)
  request.set_header(Rack::QUERY_STRING, old_request_query_string)
  @controller = old_controller
end

def with_variant(variant)

Parameters:
  • variant (Symbol) -- The variant to be set for the provided block.
def with_variant(variant)
  old_variants = controller.view_context.lookup_context.variants
  controller.view_context.lookup_context.variants = variant
  yield
ensure
  controller.view_context.lookup_context.variants = old_variants
end