Я пытаюсь проверить, чтобы увидеть, если разместить на способ создания в моем контроллере запускает обратный вызов я определил с 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 не повезло. Я ценю любую помощь!
Ваше предположение верно, и я сделал, что подправить. Благодаря! Однако для меня это все еще не удается. Является ли 'ожидать (ответ). Получать (: create_check_in_messages)' правильный синтаксис для проверки того, что обратный вызов запускается? –
Ну, во-первых, вы должны тестировать это на ModelSpec, а не на ControllerSpec, поскольку это конкретное действие модели, так что это может быть проблемой. Я считаю, что 'receive' является правильным оценщиком, но, честно говоря, я обычно проверяю обратные вызовы, проверяя, действительно ли происходит процесс манипулирования данными. Кроме того, просто FYI, вы понимаете, что, используя 'after_save', этот обратный вызов будет срабатывать при создании и обновлении? – tagCincy
Спасибо, что указал на эти недостатки. Я сделаю корректировки и попробую маршрут манипулирования данными. –