2017-07-13 18 views
1

ビルド中のRailsアプリケーションのリクエスト仕様書を作成しようとしていますが、ドキュメンテーションがまばらです(または正しいドキュメントがまだ見つかりません)。Railsインテグレーションテスト/ RSpecリクエスト仕様のURLパラメータを指定

私はいつものAPIエンドポイントのほとんどはcompaniesリソース持っている:私は私の仕様はログインしていないときは、これらのエンドポイントをヒットした場合、彼らはログインページにリダイレクトすることを示したい

# Routes ------------------------------------------------------------------- 
# companies GET /companies(.:format)   companies#index 
#    POST /companies(.:format)   companies#create 
# new_company GET /companies/new(.:format)  companies#new 
# edit_company GET /companies/:id/edit(.:format) companies#edit 
#  company GET /companies/:id(.:format)  companies#show 
#    DELETE /companies/:id(.:format)  companies#destroy 
#    PATCH /companies/:id(.:format)  companies#update 

を。最初の3つのエンドポイント(:idパラメータなしのもの)については、これは単純です:

RSpec.describe 'Companies Endpoints', type: :request do  
    context 'with anonymous user' do 
    it 'always redirects to sign-in page' do 
     get '/companies' 
     expect(response).to redirect_to(new_user_session_path) 

     post '/companies' 
     expect(response).to redirect_to(new_user_session_path) 

     get '/companies/new' 
     expect(response).to redirect_to(new_user_session_path) 
    end 
end 

エンドポイントがURLパラメータ(get '/companies/:id/edit')を含む要求の構文は何ですか?

RSpec.describe 'Companies Endpoints', type: :request do 
    let :company { FactoryGirl.create(:company) } # NOTE: this is new 

    context 'with anonymous user' do 
    it 'always redirects to sign-in page' do 
     ... 

     get "/companies/#{company.id}/edit"  # `company` is from the factory above 
     expect(response).to redirect_to(new_user_session_path) 

     ... 
    end 
    end 

が、これは「正しい」方法であれば、私は思っていた:これは私がこれまでに作ってみたものです。

具体的には、the request spec scenarios on relishapp.comは、POSTリクエストの一部としてオプションのハッシュを使用しています。このオプションのハッシュもURLパラメータにも適用されるのでしょうか?

RSpec.describe "Widget management", :type => :request do 
    it "creates a Widget and redirects to the Widget's page" do 
    post "/widgets", :params => { :widget => {:name => "My Widget"} } 
    ... 

答えて

0

リクエスト方法でURL全体を指定する必要はありません。 RSpecの代わりに(ポスト、新しい、インデックス)のも

RSpec.describe 'Companies Endpoints', type: :request do 
    let :company { FactoryGirl.create(:company) } # NOTE: this is new 

    context 'with anonymous user' do 
    it 'always redirects to sign-in page' do 
     ... 

     get :edit, { id: company.id }  # In this hash you can send any paramter, this will end up becoming your params for the request 
     expect(response).to redirect_to(new_user_session_path) 

     ... 
    end 
    end 
end 

以下に記載されてそれを行うための簡単な方法は、あなたが上記の要求提供 はway-

get :index 
expect(response).to redirect_to(new_user_session_path) 

post :create 
expect(response).to redirect_to(new_user_session_path) 

get :new 
expect(response).to redirect_to(new_user_session_path) 
+0

私を次のように書き換えることができ** HTTP要求**(_e.g。、_ '')に対応して何が起こるかをリクエスト仕様で定義しなければならないということです。これはコントローラー仕様に適していますか? –

+0

@RyanLueこれに従ってくださいhttps://relishapp.com/rspec/rspec-rails/docs/controller-specs これは正確にrpecを書くための最良の方法を示しています。 Cheers –

+0

RSpec 3.5では[コントローラスペックは要求仕様に賛成できません](https://github.com/rspec/rspec-rails/issues/1838)。馬の口元からまっすぐに: "レールアプリで作業する人々に与えることができる最高のアドバイスは、コントローラスペックの代わりにリクエスト仕様を書くことです。私は2017年に新しいコントローラー仕様を匂いにすることを検討しています... " –

関連する問題