2017-07-13 108 views
1

我正在嘗試爲我正在構建的Rails應用程序編寫請求規範,但文檔很稀疏(或者我還沒有找到合適的文檔)。在Rails集成測試/ RSpec請求規範中指定URL參數

我有一個companies資源與最常用的API端點:

# 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 

我想我的規格表明,如果你打的時候沒有登錄這些端點,它們會重定向到登錄頁面。對於前三個端點(那些沒有: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顯示使用params選項散列作爲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 這正是顯示什麼是最好的方式來編寫rpecs。歡呼 –

+0

從RSpec 3.5起,[控制器規格不鼓勵使用請求規格](https://github.com/rspec/rspec-rails/issues/1838)。直接從馬的嘴裏說道:「我們可以爲從事rails應用程序工作的人提供最好的建議,即編寫請求規格而不是控制器規格。我想在2017年寫一個新的控制器規範是一種氣味......「 –

相關問題