リクエストスペック
リクエストスペックは、Railsの統合テストを薄くラップし、 フルスタックを通じて動作を駆動するように設計されています。これにはルーティング (Railsによって提供される)とスタブ化(あなたの役割)が含まれます。
リクエストスペックは type: :request
でマークされ、または spec/requests
に配置することで
config.infer_spec_type_from_file_location!
が設定されている場合にマークされます。
リクエストスペックを使用すると、次のことができます:
- 単一のリクエストを指定する
- 複数のコントローラーをまたぐ複数のリクエストを指定する
- 複数のセッションをまたぐ複数のリクエストを指定する
統合テストに関する詳細はRailsのドキュメンテーションをご覧ください。
RSpecは、Railsのアサーションに委任する2つのマッチャを提供します:
render_template # assert_templateに委任 redirect_to # assert_redirected_toに委任
これらのメソッドの詳細については、Railsのドキュメンテーションをご覧ください。
Capybaraは リクエストスペックではサポートされていません。Capybaraの推奨される使用方法は feature specsです。
Rails統合メソッドを使用してWidgetの管理を指定する
与えられた ファイル名 "spec/requests/widget_management_spec.rb" に:
require "rails_helper"
RSpec.describe "Widget management", type: :request do
it "creates a Widget and redirects to the Widget's page" do
get "/widgets/new"
expect(response).to render_template(:new)
post "/widgets", :params => { :widget => {:name => "My Widget"} }
expect(response).to redirect_to(assigns(:widget))
follow_redirect!
expect(response).to render_template(:show)
expect(response.body).to include("Widget was successfully created.")
end
it "does not render a different template" do
get "/widgets/new"
expect(response).to_not render_template(:show)
end
end
When I run rspec spec/requests/widget_management_spec.rb
Then the example should pass.
JSONレスポンスのリクエスト
与えられた ファイル名 "spec/requests/widget_management_spec.rb" に:
require "rails_helper"
RSpec.describe "Widget management", type: :request do
it "creates a Widget" do
headers = { "ACCEPT" => "application/json" }
post "/widgets", :params => { :widget => {:name => "My Widget"} }, :headers => headers
expect(response.content_type).to eq("application/json; charset=utf-8")
expect(response).to have_http_status(:created)
end
end
When I run rspec spec/requests/widget_management_spec.rb
Then the example should pass.
JSONデータの提供
与えられた ファイル名 "spec/requests/widget_management_spec.rb" に:
require "rails_helper"
RSpec.describe "Widget management", type: :request do
it "creates a Widget and redirects to the Widget's page" do
headers = { "CONTENT_TYPE" => "application/json" }
post "/widgets", :params => '{ "widget": { "name":"My Widget" } }', :headers => headers
expect(response).to redirect_to(assigns(:widget))
end
end
When I run rspec spec/requests/widget_management_spec.rb
Then the example should pass.
エンジンルートヘルパーの使用
与えられた ファイル名 "spec/requests/widgets_spec.rb" に:
require "rails_helper"
# A very simple Rails engine
module MyEngine
class Engine < ::Rails::Engine
isolate_namespace MyEngine
end
class LinksController < ::ActionController::Base
def index
render plain: 'hit_engine_route'
end
end
end
MyEngine::Engine.routes.draw do
resources :links, :only => [:index]
end
Rails.application.routes.draw do
mount MyEngine::Engine => "/my_engine"
end
module MyEngine
RSpec.describe "Links", type: :request do
include Engine.routes.url_helpers
it "redirects to a random widget" do
get links_url
expect(response.body).to eq('hit_engine_route')
end
end
end
When I run rspec spec
Then the example should pass.
サブドメイン制約付きリクエストのテスト
与えられた ファイル名 "spec/requests/widgets_spec.rb" に:
require "rails_helper"
Rails.application.routes.draw do
resources :widgets, constraints: { subdomain: "api" }
end
RSpec.describe "Widget management", type: :request do
before { host! "api.example.com" }
it "creates a Widget" do
headers = { "ACCEPT" => "application/json" }
post "/widgets", :params => { :widget => { :name => "My Widget" } }, :headers => headers
expect(response.content_type).to start_with("application/json")
expect(response).to have_http_status(:created)
end
end
私が rspec spec
を実行するとき
その後 例はパスするべきです。