diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 9890353d7d..bfef8d0d43 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -9,6 +9,10 @@ title: Changelog ## main +* Add support for `render_preview` in RSpec tests. + + *Thomas Hutterer* + * Switch to `standardrb`. *Joel Hawksley* diff --git a/lib/view_component/render_preview_helper.rb b/lib/view_component/render_preview_helper.rb index dff5785c26..599bf8302e 100644 --- a/lib/view_component/render_preview_helper.rb +++ b/lib/view_component/render_preview_helper.rb @@ -11,15 +11,25 @@ module RenderPreviewHelper # ``` # # Note: `#rendered_preview` expects a preview to be defined with the same class - # name as the calling test, but with `Test` replaced with `Preview`: + # name as the calling test, but with "Test" replaced with "Preview": # # MyComponentTest -> MyComponentPreview etc. # + # With RSpec it uses `described_class` plus "Preview" as the class name. + # # @param preview [String] The name of the preview to be rendered. # @return [Nokogiri::HTML] def render_preview(name) begin - preview_klass = self.class.name.gsub("Test", "Preview") + preview_klass = if respond_to?(:described_class) + if described_class.nil? + raise "`render_preview` expected a described_class, but it is nil." + end + + "#{described_class}Preview" + else + self.class.name.gsub("Test", "Preview") + end preview_klass = preview_klass.constantize rescue NameError raise NameError.new( diff --git a/test/sandbox/spec/components/previews/preview_component_spec.rb b/test/sandbox/spec/components/previews/preview_component_spec.rb new file mode 100644 index 0000000000..7ff19a5db7 --- /dev/null +++ b/test/sandbox/spec/components/previews/preview_component_spec.rb @@ -0,0 +1,25 @@ +describe PreviewComponent do + include ViewComponent::RenderPreviewHelper + + before do + ViewComponent::Preview.load_previews + end + + it "renders the preview" do + render_preview(:default) + + expect(page).to have_css "h1", text: "Lorem Ipsum" + end +end + +describe "PreviewComponent" do + include ViewComponent::RenderPreviewHelper + + before do + ViewComponent::Preview.load_previews + end + + it "raises an error" do + expect { render_preview(:default) }.to raise_error(/expected a described_class/) + end +end