2014-12-19 5 views
0

Я пытаюсь проверить, чтобы увидеть, если разместить на способ создания в моем контроллере запускает обратный вызов я определил с after_saveRspec тест контроллера для обратного вызова 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)>' 

Я искал во всем StackOverflow не повезло. Я ценю любую помощь!

ответ

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

Ваше предположение верно, и я сделал, что подправить. Благодаря! Однако для меня это все еще не удается. Является ли 'ожидать (ответ). Получать (: create_check_in_messages)' правильный синтаксис для проверки того, что обратный вызов запускается? –

+0

Ну, во-первых, вы должны тестировать это на ModelSpec, а не на ControllerSpec, поскольку это конкретное действие модели, так что это может быть проблемой. Я считаю, что 'receive' является правильным оценщиком, но, честно говоря, я обычно проверяю обратные вызовы, проверяя, действительно ли происходит процесс манипулирования данными. Кроме того, просто FYI, вы понимаете, что, используя 'after_save', этот обратный вызов будет срабатывать при создании и обновлении? – tagCincy

+0

Спасибо, что указал на эти недостатки. Я сделаю корректировки и попробую маршрут манипулирования данными. –

Смежные вопросы