Module: ViewComponent::TestHelpers
- Included in:
- TestCase
- Defined in:
- lib/view_component/test_helpers.rb
Instance Attribute Summary collapse
- #rendered_content ⇒ Object readonly
Instance Method Summary collapse
- #build_controller(klass) ⇒ Object
- #controller ⇒ Object
-
#render_in_view_context(&block) ⇒ Object
Execute the given block in the view context.
-
#render_inline(component, **args, &block) ⇒ Nokogiri::HTML
Render a component inline.
-
#render_preview(name, params: {}) ⇒ Nokogiri::HTML
Render a preview inline.
-
#rendered_component ⇒ String
Returns the result of a render_inline call.
- #request ⇒ Object
-
#with_controller_class(klass) ⇒ Object
Set the controller to be used while executing the given block, allowing access to controller-specific methods:.
-
#with_request_url(path) ⇒ Object
Set the URL of the current request (such as when using request-dependent path helpers):.
-
#with_variant(variant) ⇒ Object
Set the Action Pack request variant for the given block:.
Instance Attribute Details
#rendered_content ⇒ Object (readonly)
32 33 34 |
# File 'lib/view_component/test_helpers.rb', line 32 def rendered_content @rendered_content end |
Instance Method Details
#build_controller(klass) ⇒ Object
216 217 218 |
# File 'lib/view_component/test_helpers.rb', line 216 def build_controller(klass) klass.new.tap { |c| c.request = request }.extend(Rails.application.routes.url_helpers) end |
#controller ⇒ Object
134 135 136 |
# File 'lib/view_component/test_helpers.rb', line 134 def controller @controller ||= build_controller(Base.test_controller.constantize) end |
#render_in_view_context(&block) ⇒ Object
Execute the given block in the view context. Internally sets ‘page` to be a `Capybara::Node::Simple`, allowing for Capybara assertions to be used:
“‘ruby render_in_view_context do
render(MyComponent.new)
end
assert_text(“Hello, World!”) “‘
127 128 129 130 131 |
# File 'lib/view_component/test_helpers.rb', line 127 def render_in_view_context(&block) @page = nil @rendered_content = controller.view_context.instance_exec(&block) Nokogiri::HTML.fragment(@rendered_content) end |
#render_inline(component, **args, &block) ⇒ Nokogiri::HTML
Render a component inline. Internally sets ‘page` to be a `Capybara::Node::Simple`, allowing for Capybara assertions to be used:
“‘ruby render_inline(MyComponent.new) assert_text(“Hello, World!”) “`
56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/view_component/test_helpers.rb', line 56 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 |
#render_preview(name, params: {}) ⇒ Nokogiri::HTML
Render a preview inline. Internally sets ‘page` to be a `Capybara::Node::Simple`, allowing for Capybara assertions to be used:
“‘ruby render_preview(:default) assert_text(“Hello, World!”) “`
Note: ‘#rendered_preview` expects a preview to be defined with the same class name as the calling test, but with `Test` replaced with `Preview`:
MyComponentTest -> MyComponentPreview etc.
In RSpec, ‘Preview` is appended to `described_class`.
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/view_component/test_helpers.rb', line 86 def render_preview(name, params: {}) 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) # From what I can tell, it's not possible to overwrite all request parameters # at once, so we set them individually here. params.each do |k, v| previews_controller.request.params[k] = v end 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 |
#rendered_component ⇒ String
Returns the result of a render_inline call.
37 38 39 40 41 42 43 44 |
# File 'lib/view_component/test_helpers.rb', line 37 def rendered_component ViewComponent::Deprecation.warn( "`rendered_component` is deprecated and will be removed in v3.0.0. " \ "Use `page` instead." ) rendered_content end |
#request ⇒ Object
139 140 141 142 143 144 145 146 |
# File 'lib/view_component/test_helpers.rb', line 139 def request @request ||= begin request = ActionDispatch::TestRequest.create request.session = ActionController::TestSession.new request end end |
#with_controller_class(klass) ⇒ Object
Set the controller to be used while executing the given block, allowing access to controller-specific methods:
“‘ruby with_controller_class(UsersController) do
render_inline(MyComponent.new)
end “‘
176 177 178 179 180 181 182 183 |
# File 'lib/view_component/test_helpers.rb', line 176 def with_controller_class(klass) old_controller = defined?(@controller) && @controller @controller = build_controller(klass) yield ensure @controller = old_controller end |
#with_request_url(path) ⇒ Object
Set the URL of the current request (such as when using request-dependent path helpers):
“‘ruby with_request_url(“/users/42”) do
render_inline(MyComponent.new)
end “‘
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
# File 'lib/view_component/test_helpers.rb', line 194 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 |
#with_variant(variant) ⇒ Object
Set the Action Pack request variant for the given block:
“‘ruby with_variant(:phone) do
render_inline(MyComponent.new)
end “‘
157 158 159 160 161 162 163 164 |
# File 'lib/view_component/test_helpers.rb', line 157 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 |