2014-12-19 109 views
0

我想测试Rspec的控制器测试,看是否张贴在我的控制器中的创建方法触发我after_save的回调after_save的

这里定义的回调年代控制器方法被张贴到

def create 
@guest = Guest.new(guest_params) 
@hotel = Hotel.find(visit_params[:hotel_id]) 

#set visit local times to UTC 
@visit= Visit.new(visit_params) 
@visit.checked_out_at = (DateTime.now.utc + visit_params[:checked_out_at].to_i.to_i.days).change(hour: @visit.hotel.checkout_time.hour) 
@visit.checked_in_at = Time.now.utc 
#@visit.user_id = current_user.id 
@self_serve = (params[:self_serve] && params[:self_serve] == "true") 
if @guest.save 
    @visit.guest_id = @guest.id 
    if @visit.save 
    if @self_serve 
     flash[:notice] = "#{@visit.guest.name}, you have successfully checked in!." 
     redirect_to guest_checkin_hotel_path(@visit.hotel) 
    else 
     flash[:notice] = "You have successfully checked in #{@visit.guest.name}." 
     redirect_to hotel_path(@visit.hotel) 
    end 
    else 
    render "new" 
    end 
else 
    render "new" 
end 
end 

这里是我的规格/控制器/ guests_controller_spec.rb测试失败

RSpec.describe GuestsController, :type => :controller do 
describe "#create" do 
    let!(:params) do { name: "John Smith", mobile_number: "9095551234" } end 
    context "when new guest is saved" do 
     it "triggers create_check_in_messages callback" do 
      post :create, params 
      expect(response).to receive(:create_check_in_messages) 
     end 
    end 
end 
end 

这里是我的模型/顾虑/ visit_message.rb回调文件

module VisitMessage 
    extend ActiveSupport::Concern 

    included do 
    after_save :create_check_in_messages 
    end 

    def create_check_in_messages 
    . . . 
    end 
end 

这是当我运行“rspec的投机/控制器/ guests_controller_spec.rb”

1) GuestsController#create when new guest is saved triggers create_check_in_messages callback 
Failure/Error: post :create, params 
ActionController::ParameterMissing: 
    param is missing or the value is empty: guest 
# ./app/controllers/guests_controller.rb:63:in `guest_params' 
# ./app/controllers/guests_controller.rb:10:in `create' 
# ./spec/controllers/guests_controller_spec.rb:36:in `block (4 levels) in <top (required)>' 

我一直在寻找全国各地,没有运气计算器的失败消息。我感谢任何帮助!

回答

1

我假设,在控制器的guest_params方法看起来是这样的:

def guest_params 
    params.require(:guest).permit(....) 
end 

如果是这样的话,你需要在你的测试用例更新POST调用正是如此:

post :create, {guest: params} 

在一个侧面说明,你的控制器是不必要的臃肿。我将与关联模型的工作,以简化你的代码,具体而言,使用accepts_nested_attributes_for读了起来:

http://guides.rubyonrails.org/association_basics.html#detailed-association-reference http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

+0

你的假设是正确的,我做了调整。谢谢!但是,对我来说这仍然是失败的。 'expect(response).to receive(:create_check_in_messages)'正确的语法来测试回调是否被触发? –

+0

嗯,首先,你应该在ModelSpec测试这个,不是ControllerSpec因为它是一个型号的具体行动,因此这可能是问题。我相信'接受'是正确的评估者,但是诚实地说,我通常通过检查数据操作过程是否真的发生来测试回调。此外,只是供参考,你意识到通过使用'after_save',这个回调会触发创建和更新? – tagCincy

+0

感谢您指出这些缺陷。我将进行调整并尝试数据处理路线。 –

相关问题