メインコンテンツまでスキップ

ビュースペック

ビュースペックは type: :view とマークされます または config.infer_spec_type_from_file_location! を設定している場合は spec/views に配置することで指定します。

特定のコントローラを呼び出さずに ビューテンプレートの内容をテストするために使用します。 通常、以下の3つのステップに従います。

(assign(:widget, Widget.new)  # sets @widget = Widget.new in the view template

render

expect(rendered).to match(/text/)
  1. assign メソッドを使用してビュー内のインスタンス変数を設定します。

  2. render メソッドを使用してビューをレンダリングします。

  3. レンダリングされたテンプレートに対して期待値を設定します。

ビュースペックは指定されたビューファイルをレンダリングします

次の内容で "spec/views/widgets/index.html.erb_spec.rb" という名前のファイルがあるとします:

require "rails_helper"

RSpec.describe "widgets/index" do
it "displays all the widgets" do
assign(:widgets, [
Widget.create!(:name => "slicer"),
Widget.create!(:name => "dicer")
])

render

expect(rendered).to match /slicer/
expect(rendered).to match /dicer/
end
end

rspec spec/views を実行すると

すべての例がパスするはずです。

ビュースペックには before ブロックとネストができます

次の内容で "spec/views/widgets/index.html.erb_spec.rb" という名前のファイルがあるとします:

require "rails_helper"

RSpec.describe "widgets/index" do

context "with 2 widgets" do
before(:each) do
assign(:widgets, [
Widget.create!(:name => "slicer"),
Widget.create!(:name => "dicer")
])
end

it "displays both widgets" do
render

expect(rendered).to match /slicer/
expect(rendered).to match /dicer/
end
end
end

rspec spec/views を実行すると

すべての例がパスするはずです。

ビュースペックは明示的にテンプレートをレンダリングできます

次の内容で "spec/views/widgets/widget.html.erb_spec.rb" という名前のファイルがあるとします:

require "rails_helper"

RSpec.describe "rendering the widget template" do
it "displays the widget" do
assign(:widget, Widget.create!(:name => "slicer"))

render :template => "widgets/widget"

expect(rendered).to match /slicer/
end
end

次の内容で "app/views/widgets/widget.html.erb" という名前のファイルがあるとします:

<h2><%= @widget.name %></h2>

rspec spec/views を実行すると

すべての例がパスするはずです。

ビュースペックはレイアウト内のテンプレートをレンダリングできます

次の内容で "spec/views/widgets/widget.html.erb_spec.rb" という名前のファイルがあるとします:

require "rails_helper"

RSpec.describe "rendering the widget template" do
context "with the inventory layout" do
it "displays the widget" do
assign(:widget, Widget.create!(:name => "slicer"))

render :template => "widgets/widget", :layout => "layouts/inventory"

expect(rendered).to match /slicer/
end
end
end

次の内容で "app/views/widgets/widget.html.erb" という名前のファイルがあるとします:

<h2><%= @widget.name %></h2>

次の内容で "app/views/layouts/inventory.html.erb" という名前のファイルがあるとします:

<%= yield %>

rspec spec/views を実行すると

すべての例がパスするはずです。

ビュースペックにはフォーマットとハンドラを含む説明ができます

次の内容で "spec/views/widgets/widget.xml.erb_spec.rb" という名前のファイルがあるとします:

require "rails_helper"

RSpec.describe "widgets/widget.html.erb" do
it "renders the HTML template" do
render

expect(rendered).to match /HTML/
end
end

RSpec.describe "widgets/widget.xml.erb" do
it "renders the XML template" do
render

expect(rendered).to match /XML/
end
end

次の内容で "app/views/widgets/widget.html.erb" という名前のファイルがあるとします:

HTML

次の内容で "app/views/widgets/widget.xml.erb" という名前のファイルがあるとします:

XML

When I run rspec spec/views

Then the examples should all pass.

ビュースペックはローカル変数を使用してテンプレートをレンダリングできます

Given a file named "spec/views/widgets/_widget.html.erb_spec.rb" with:

require "rails_helper"

RSpec.describe "widgets/index" do
it "displays the widget" do
widget = Widget.create!(:name => "slicer")

render :locals => {:widget => widget}

expect(rendered).to match /slicer/
end
end

And a file named "app/views/widgets/index.html.erb" with:

<h3><%= widget.name %></h3>

When I run rspec spec/views

Then the examples should all pass.

ビュースペックはパーシャル内のローカル変数をレンダリングできます

Given a file named "spec/views/widgets/_widget.html.erb_spec.rb" with:

require "rails_helper"

RSpec.describe "rendering locals in a partial" do
it "displays the widget" do
widget = Widget.create!(:name => "slicer")

render :partial => "widgets/widget", :locals => {:widget => widget}

expect(rendered).to match /slicer/
end
end

And a file named "app/views/widgets/_widget.html.erb" with:

<h3><%= widget.name %></h3>

When I run rspec spec/views

Then the examples should all pass.

ビュースペックは暗黙のパーシャル内のローカル変数をレンダリングできます

Given a file named "spec/views/widgets/_widget.html.erb_spec.rb" with:

require "rails_helper"

RSpec.describe "rendering locals in a partial" do
it "displays the widget" do
widget = Widget.create!(:name => "slicer")

render "widgets/widget", :widget => widget

expect(rendered).to match /slicer/
end
end

And a file named "app/views/widgets/_widget.html.erb" with:

<h3><%= widget.name %></h3>

When I run rspec spec/views

Then the examples should all pass.

ビュースペックはテキストをレンダリングできます

Given a file named "spec/views/widgets/direct.html.erb_spec.rb" with:

require "rails_helper"

RSpec.describe "rendering text directly" do
it "displays the given text" do

render :plain => "This is directly rendered"

expect(rendered).to match /directly rendered/
end
end

When I run rspec spec/views

Then the examples should all pass.

ビュースペックはヘルパーメソッドをスタブ化できます

Given a file named "app/helpers/application_helper.rb" with:

module ApplicationHelper
def admin?
false
end
end

And a file named "app/views/secrets/index.html.erb" with:

<%- if admin? %>
<h1>Secret admin area</h1>
<%- end %>

And a file named "spec/views/secrets/index.html.erb_spec.rb" with:

require 'rails_helper'

RSpec.describe 'secrets/index' do
before do
allow(view).to receive(:admin?).and_return(true)
end

it 'checks for admin access' do
render
expect(rendered).to match /Secret admin area/
end
end

When I run rspec spec/views/secrets

Then the examples should all pass.

ビュースペックはrequest.path_parametersのキーにシンボルを使用してRailsスタイルに一致させます

Given a file named "spec/views/widgets/index.html.erb_spec.rb" with:

require "rails_helper"

RSpec.describe "controller.request.path_parameters" do
it "matches the Rails environment by using symbols for keys" do
[:controller, :action].each { |k| expect(controller.request.path_parameters.keys).to include(k) }
end
end

When I run rspec spec/views

Then the examples should all pass.

追加のパラメータを必要としないビュースペックアクションでは、request.fullpathが設定されます

Given a file named "spec/views/widgets/index.html.erb_spec.rb" with:

  require "rails_helper"

RSpec.describe "widgets/index" do
it "has a request.fullpath that is defined" do
expect(controller.request.fullpath).to eq widgets_path
end
end

When I run rspec spec/views

Then the examples should all pass.

開発者が追加のパラメータを指定した場合、追加のパラメータが必要なビュースペックのアクションでは request.fullpath が設定される

Given a file named "spec/views/widgets/show.html.erb_spec.rb" with:

  require "rails_helper"

RSpec.describe "widgets/show" do
it "displays the widget with id: 1" do
widget = Widget.create!(:name => "slicer")
controller.extra_params = { :id => widget.id }

expect(controller.request.fullpath).to eq widget_path(widget)
end
end

When I run rspec spec/views

Then the examples should all pass.