【问题标题】:Rspec controller post request to render different partialsRspec 控制器发布请求以呈现不同的部分
【发布时间】:2014-12-19 17:29:52
【问题描述】:

我正在尝试编写一个控制器规范来测试正确的部分是否在发布请求后呈现。

这是发布到的控制器方法:

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

这是我写的失败的 spec/controllers/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

这是我用于 :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)>'

我这几天一直在研究这个问题,尝试在这里找到的不同方法,但没有运气。任何帮助将不胜感激:)

【问题讨论】:

  • 在错误中你可以看到渲染的部分列表:它渲染了guests/form

标签: ruby-on-rails ruby post rspec controller


【解决方案1】:

你发送

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"

【讨论】:

  • 感谢您指出这一点。这是一个很好的观点,对我来说是一个愚蠢的错误。我做了那个调整,但它仍然给我同样的错误。
  • @NamNguyen 您可以通过非常简单的方式对其进行调试。只需在控制器中添加raise Guest.all.inspectraise params.inspect 作为第一行并运行您的规范。通过这样做,您将检查测试期间传入的参数以及您在数据库中查找的 Guest
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多