2014-12-19 43 views
0

我想寫一個控制器規範來測試發佈請求後正確的部分渲染。Rspec控制器發佈請求呈現不同的部分

這裏是控制器的方法被髮布到:

def lookup 
@guest = Guest.where("mobile_number = ?", params[:lookup_mobile_phone_number]).first_or_initialize do |g| 
    g.mobile_number = params[:lookup_mobile_phone_number] 
end 
if @guest.new_record? 
    @visit = Visit.new(hotel_id: params[:hotel_id]) 
    render partial: "guests/form" 
else 
    @visit = Visit.new(guest_id: @guest.id, hotel_id: params[:hotel_id]) 
    render partial: "visits/form" 
end 
end 

這裏是投機/控制器/ guests_controller_spec.rb我寫的失敗:

RSpec.describe GuestsController, :type => :controller do 
describe "#lookup" do 
render_views 
let!(:returning_guest) { create(:test_guest) } 
    context "when guest is already registered with hotel" do 
     it "renders visits/form" do 
     post :lookup, :guest => { :lookup_mobile_phone_number => "5553331212"} 
     expect(response).to render_template(:partial => 'visits/form') 
     end 
    end 
end 
end 

這裏是工廠,我使用for:test_guest

FactoryGirl.define do 
    factory :test_guest, :class => 'Guest' do 
    name 'Jack Guest' 
    mobile_number '5553331212' 
    end 
end 

這是我在測試失敗時得到的響應

1) GuestsController#lookup when guest is already registered with hotel renders visits/form 
    Failure/Error: expect(response).to render_template(:partial => 'visits/form') 
    expecting partial <visits/form> but action rendered <["shared/_hotel_agent_name",  "_hotel_agent_name", "guests/_form", "_form"]>. 
    Expected {"shared/_hotel_agent_name"=>1, "_hotel_agent_name"=>1, "guests/_form"=>1, "_form"=>1} to include "visits/form". 
# ./spec/controllers/guests_controller_spec.rb:16:in `block (4 levels) in <top (required)>' 

我一直在黑客攻擊這個幾天,現在嘗試不同的方法在這裏找到沒有運氣。任何幫助,將不勝感激:)

+0

在錯誤中,您可以看到呈現的部分列表:它代替呈現'guests/form'。 – nathanvda

回答

0

您發送

post :lookup, :guest => { :lookup_mobile_phone_number => "5553331212"} 

但在控制器,可以使用

params[:lookup_mobile_phone_number] 

params[:guest][:lookup_mobile_phone_number] 

因此,要解決這個問題,根據您的控制器,做

post :lookup, :lookup_mobile_phone_number => "5553331212" 
+0

謝謝你指出。我認爲這是一個很好的觀點和愚蠢的錯誤。我做了調整,但它仍然給我同樣的確切的錯誤。 –

+0

@NamNguyen你可以用一種非常簡單的方式進行調試。只需在控制器中添加'raise Guest.all.inspect'或'raise params.inspect'作爲第一行並運行您的規範。通過這樣做,您可以檢查測試期間傳入的參數以及數據庫中是否存在您正在查找的「Guest」。 –

+0

太棒了,感謝您的幫助和幫助! –

相關問題