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

ビューはデフォルトでスタブ化されます

デフォルトでは、コントローラのスペックはアプリ内のビューではなく、空の文字列をレンダリングするテンプレートでビューをスタブ化します。これにより、テンプレートが正常にコンパイルされるかどうかに関係なく、アクションがどのビューテンプレートをレンダリングしようとするかを指定できます。

注意: rspec-rails-1.xとは異なり、実際のテンプレートが存在する必要があります。

コントローラのアクションによってレンダリングされるテンプレートを期待する(パスする)

以下の内容で「spec/controllers/widgets_controller_spec.rb」という名前のファイルが存在するとき:

require "rails_helper"

RSpec.describe WidgetsController, type: :controller do
describe "index" do
it "renders the index template" do
get :index
expect(response).to render_template("index")
expect(response.body).to eq ""
end
it "renders the widgets/index template" do
get :index
expect(response).to render_template("widgets/index")
expect(response.body).to eq ""
end
end
end

rspec specを実行すると、

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

コントローラのアクションによってレンダリングされないテンプレートを期待する(失敗する)

以下の内容で「spec/controllers/widgets_controller_spec.rb」という名前のファイルが存在するとき:

require "rails_helper"

RSpec.describe WidgetsController, type: :controller do
describe "index" do
it "renders the 'new' template" do
get :index
expect(response).to render_template("new")
end
end
end

rspec specを実行すると、

出力には「1 example, 1 failure」という文言が含まれるはずです。

ビューパスが実行時に変更された場合に空のテンプレートがレンダリングされることを期待する(パスする)

以下の内容で「spec/controllers/things_controller_spec.rb」という名前のファイルが存在するとき:

require "rails_helper"

RSpec.describe ThingsController, type: :controller do
describe "custom_action" do
it "renders an empty custom_action template" do
controller.prepend_view_path 'app/views'
controller.append_view_path 'app/views'
get :custom_action
expect(response).to render_template("custom_action")
expect(response.body).to eq ""
end
end
end

以下の内容で「app/controllers/things_controller.rb」という名前のファイルが存在するとき:

class ThingsController < ActionController::Base
layout false
def custom_action
end
end

以下の内容で「app/views/things/custom_action.html.erb」という名前のファイルが存在するとき:


_When_ I run `rspec spec`

_Then_ the examples should all pass.

## Expect a template to render the real template with render_views when view path is changed at runtime

_Given_ a file named "spec/controllers/things_controller_spec.rb" with:

```ruby
require "rails_helper"

RSpec.describe ThingsController, type: :controller do
render_views

it "renders the real custom_action template" do
controller.prepend_view_path 'app/views'
get :custom_action
expect(response).to render_template("custom_action")
expect(response.body).to match(/template for a custom action/)
end
end

rspec specを実行すると、

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