我想测试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)>'
我一直在寻找全国各地,没有运气计算器的失败消息。我感谢任何帮助!
你的假设是正确的,我做了调整。谢谢!但是,对我来说这仍然是失败的。 'expect(response).to receive(:create_check_in_messages)'正确的语法来测试回调是否被触发? –
嗯,首先,你应该在ModelSpec测试这个,不是ControllerSpec因为它是一个型号的具体行动,因此这可能是问题。我相信'接受'是正确的评估者,但是诚实地说,我通常通过检查数据操作过程是否真的发生来测试回调。此外,只是供参考,你意识到通过使用'after_save',这个回调会触发创建和更新? – tagCincy
感谢您指出这些缺陷。我将进行调整并尝试数据处理路线。 –