DEV Community

Ilya N. Zykin
Ilya N. Zykin

Posted on

How to write a View test in Rails with RSpec

I want to write a View test. What should I do?

Step 1. Learn the view template

<% content_for :head do %>
  <title>Project Name</title>

  <link
    rel="preload"
    as="image"
    href="<%= vite_asset_url 'images/logo.jpg' %>"
  />
<% end %>

<% @blogs.each_with_index do |blog| %>
  <li><%= blog.title %></li>
<% end %>
Enter fullscreen mode Exit fullscreen mode

Here I see

  1. View variable @blogs
  2. Rails helper vite_asset_url

Step 2. How to stub a rails helper?

To do that I'm going to use the following way. Here in view I stub vite_asset_url and it will return a string "vite_asset_url".

allow(view).to
  receive(:vite_asset_url).and_return("vite_asset_url")
Enter fullscreen mode Exit fullscreen mode

Step 3. How to stub a view variable?

To do that I use assign test helper.

assign(:blogs, [blog1, blog2, blog2])
Enter fullscreen mode Exit fullscreen mode

Step 4. How a test should look?

It looks like that:

require 'rails_helper'

RSpec.describe "site/landing/index", type: :view do
  let!(:published_blogs) do
    create_list(:blog, 3, :published, :for_blog) do |blog, index|
      blog.title =  "Blog Title #{index.next}"
      blog.save!
    end
  end

  before do
    allow(view).to
      receive(:vite_asset_url).and_return("vite_asset_url")
  end

  it "renders attributes in show page" do
    assign(:blogs,  published_blogs)

    render

    expect(rendered).to match(/Blog Title 1/)
    expect(rendered).to match(/Blog Title 2/)
    expect(rendered).to match(/Blog Title 3/)
  end
end
Enter fullscreen mode Exit fullscreen mode

That is it!
Happy Coding!

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more